sorting - 推力:sort_by_key 与 zip_iterator 性能

标签 sorting cuda thrust

问题

我正在使用 sort_by_key使用 zip_iterator 传递值.此 sort_by_key被多次调用,经过一定的迭代后变为 10x 较慢 !这是什么原因引起的性能下降 ?

症状

我正在使用 sort_by_key 对 3 个向量进行排序,其中之一作为关键向量:

struct Segment
{
  int v[2];
};

thrust::device_vector<int> keyVec;
thrust::device_vector<int> valVec;
thrust::device_vector<Segment> segVec;

// ... code which fills these vectors ...

thrust::sort_by_key( keyVec.begin(), keyVec.end(),
                     make_zip_iterator( make_tuple( valVec.begin(), segVec.begin() ) ) );

向量的大小通常在 400 万左右。在最初的 2 次中,它被调用,sort_by_key需要 0.04 秒,在循环 3 中需要 0.1 秒,然后在其余循环中进一步降级到 0.3 秒。因此,我们看到性能下降了 10 倍。

额外信息

确保唯一的降级因素是 sort_by_key ,我用手写内核手动排序替换了上面的内容:
thrust::device_vector<int> indexVec( keyVec.size() );
thrust::sequence( indexVec.begin(), indexVec.end() );

// Sort the keys and indexes
thrust::sort_by_key( keyVec.begin(), keyVec.end(), indexVec.begin() );

thrust::device_vector<int> valVec2( keyVec.size() );
thrust::device_vector<Segment> segVec2( keyVec.size() );

// Use index array and move vectors to destination
moveKernel<<< x, y >>>(
  toRawPtr( indexVec ),
  indexVec.size(),
  toRawPtr( valVec ),
  toRawPtr( segVec ),
  toRawPtr( valVec2 ),
  toRawPtr( segVec2 ) );

// Swap back into original vectors
valVec.swap( valVec2 );
segVec.swap( segVec2 );

这种手写排序需要 0.03 秒,并且这种性能在所有迭代中都是一致的,这与 sort_by_key 和 zip_iterator 的性能下降不同。

最佳答案

为了在每个循环中准确计时,您需要在每个循环结束时使用 cudaThreadSynchronize。您为前两个循环获得的时间可能不是您正在寻找的实际时间。

关于sorting - 推力:sort_by_key 与 zip_iterator 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5753317/

相关文章:

python - 在字符串列表上使用排序和关键参数

javascript - Lodash 根据提供的比较器排序

algorithm - 通过仅将元素移动到开头或结尾来对数组进行排序

matlab - 在单独的编译模式下将cuda代码进行mex链接

c++ - CUDA/推力图像处理

c++ - 动态大小的推力元组

c++ - 按 Y 排序三角形顶点时知道中间顶点是左还是右?

c++ - 构建一个使用 boost 的 .cu 文件

c++ - rand() 在通过仿函数调用时生成相同的随机数集(即使在使用 srand(time(NULL)) 播种后)

cuda - uint2 : "has no member x" compiler error? 类型的推力向量