gpt4 book ai didi

cuda - 快速 CUDA 推力自定义比较运算符

转载 作者:行者123 更新时间:2023-12-05 00:35:46 24 4
gpt4 key购买 nike

我正在评估 CUDA,目前正在使用 Thrust 库对数字进行排序。

我想为推力::排序创建我自己的比较器,但它会显着减慢!
我创建了自己的 只需从 复制代码即可实现功能.h .
然而,它似乎以其他方式编译并且工作非常缓慢。

  • 默认比较器:推力::less() - 94 女士
  • 我自己的比较器:less() - 906 女士

  • 我使用的是 Visual Studio 2010。我应该怎么做才能获得与选项 1 相同的性能?

    完整代码:
    #include <stdio.h>

    #include <cuda.h>

    #include <thrust/host_vector.h>
    #include <thrust/device_vector.h>
    #include <thrust/generate.h>
    #include <thrust/sort.h>

    int myRand()
    {
    static int counter = 0;
    if ( counter++ % 10000 == 0 )
    srand(time(NULL)+counter);
    return (rand()<<16) | rand();
    }

    template<typename T>
    struct less : public thrust::binary_function<T,T,bool>
    {
    __host__ __device__ bool operator()(const T &lhs, const T &rhs) const {
    return lhs < rhs;
    }
    };

    int main()
    {
    thrust::host_vector<int> h_vec(10 * 1000 * 1000);
    thrust::generate(h_vec.begin(), h_vec.end(), myRand);

    thrust::device_vector<int> d_vec = h_vec;

    int clc = clock();
    thrust::sort(d_vec.begin(), d_vec.end(), less<int>());
    printf("%dms\n", (clock()-clc) * 1000 / CLOCKS_PER_SEC);

    return 0;
    }

    最佳答案

    您观察到性能差异的原因是因为 Thrust 正在使用不同的算法实现排序,具体取决于提供给 thrust::sort 的参数。 .

    在第一种情况下,Thrust 可以证明排序可以在线性时间内用基数排序实现。这是因为要排序的数据类型是内置的数值类型( int ),比较函数是内置的小于操作——Thrust 识别出thrust::less<int>将产生与 x < y 等效的结果.

    在第 2 种情况下,Thrust 对您的用户提供的 less<int> 一无所知。 ,并且必须使用基于比较排序的更保守的算法,该算法具有不同的渐近复杂度,即使实际上您的 less<int>相当于 thrust::less<int> .

    通常,用户定义的比较运算符不能与更严格、更快的排序一起使用,这些排序操作数据的二进制表示,例如基数排序。在这些情况下,Thrust 回退到更一般但更慢的排序。

    关于cuda - 快速 CUDA 推力自定义比较运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9037906/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com