Thrust:sort_by_key,具有zip_iterator性能

时间:2011-04-22 07:38:58

标签: 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() ) ) );

载体的大小通常约为4百万。在最初的2次调用中,sort_by_key需要0.04s,在循环3中需要0.1s,然后在其余循环中进一步降级到0.3s。因此,我们发现性能下降了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的性能下降不同。

1 个答案:

答案 0 :(得分:1)

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