Cuda 带迭代器的立方排序

Cuda 带迭代器的立方排序,cuda,thrust,cub,Cuda,Thrust,Cub,我希望一次性转换值并对其进行排序,如下所示: thrust::vector<int> dataIn = ... thrust::vector<int> dataOut = ... auto iterIn = cub::TransformInputIterator<int, Ftor, int*>(dataIn.begin(), Ftor()); cub::DeviceRadixSort::SortKeys(dTemp, tempBytes, iterIn,

我希望一次性转换值并对其进行排序,如下所示:

thrust::vector<int> dataIn  = ...
thrust::vector<int> dataOut = ...
auto iterIn = cub::TransformInputIterator<int, Ftor, int*>(dataIn.begin(), Ftor());
cub::DeviceRadixSort::SortKeys(dTemp, tempBytes, iterIn, dataOut.begin(), numElems);
推力::矢量数据输入=。。。 推力::矢量数据输出=。。。 auto iterIn=cub::TransformInputIterator(dataIn.begin(),Ftor()); cub::DeviceRadixSort::SortKeys(dTemp、tempBytes、iterIn、dataOut.begin()、numElems); 然而,SortKeys需要原始指针而不是迭代器。 尽管如此,还是可以使用迭代器来完成这项工作吗? 我知道这是可能的推力,但我想使用幼兽


谢谢您的建议。

很抱歉让您失望,但AFAIK CUB不支持这一点。理论上,它可以通过更深入的模板化实现,但事实并非如此


您可以从cub中提取代码,或者使用额外的模板参数修改代码。这将是一个令人头痛的问题,但如果您只想通过设备端函数的某种转换来传递输入值,这是可行的。

很抱歉让您失望,但AFAIK CUB不支持这一点。理论上,它可以通过更深入的模板化实现,但事实并非如此


您可以从cub中提取代码,或者使用额外的模板参数修改代码。这将是一个令人头痛的问题,但如果您只想通过设备端函数的某种转换来传递输入值,那么这是可行的。

您是否意识到,推力在内部使用CUB进行排序实现?@talonmies是的,我知道,我有两个理由不使用推力。首先,我不能预先分配和重用对我来说至关重要的临时存储。第二,CUB本身速度更快,这可能也是第一个的结果。您可以预先分配和重用临时存储。请看。@RobertCrovella非常感谢您的建议。CUB Github上的绘图显示了相应CUB调用和推力调用之间的显著差异。你知道为什么推力较慢吗?我假设基准测试是使用缓存分配器完成的。我不确定您指的是哪种“绘图”,但它们可能可以追溯到一个时间点,在那个时间点上,推力没有在引擎盖下使用CUB。推力早于幼崽,所以当幼崽出现时,这是一件很自然的事情。如果在苹果对苹果排序比较中,推力比CUB慢得多(这可能包括删除分配临时缓冲区的时间),我会感到惊讶。你知道推力在内部使用CUB进行排序实现吗?@talonmies是的,我知道,我有两个理由不使用推力。首先,我不能预先分配和重用对我来说至关重要的临时存储。第二,CUB本身速度更快,这可能也是第一个的结果。您可以预先分配和重用临时存储。请看。@RobertCrovella非常感谢您的建议。CUB Github上的绘图显示了相应CUB调用和推力调用之间的显著差异。你知道为什么推力较慢吗?我假设基准测试是使用缓存分配器完成的。我不确定您指的是哪种“绘图”,但它们可能可以追溯到一个时间点,在那个时间点上,推力没有在引擎盖下使用CUB。推力早于幼崽,所以当幼崽出现时,这是一件很自然的事情。如果在苹果对苹果排序比较中,推力比CUB慢得多,我会感到惊讶(这可能包括删除分配临时缓冲区所花费的时间)