问题
我正在使用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的性能下降不同。
答案 0 :(得分:1)
为了在每个循环中准确计时,您需要在每个循环结束时使用cudaThreadSynchronize。前两个循环的时间可能不是您要查找的实际时间。