gpt4 book ai didi

sorting - 推力:sort_by_key 与 zip_iterator 性能

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

问题

我正在使用 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/

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