Cuda 按键排序>;10个整数序列。猛力

Cuda 按键排序>;10个整数序列。猛力,cuda,thrust,Cuda,Thrust,我想执行一个按键排序,其中我有一个单键序列 和多值序列 一个人通常会用 sort_by_key( key, key + N, make_zip_iterator( make_tuple(x1 , x2 , ...) ) ) 但是,我想执行一个排序,每个长度大于10个

我想执行一个
按键排序
,其中我有一个单键序列 和多值序列

一个人通常会用

sort_by_key(
             key, 
             key + N, 
             make_zip_iterator(
                                make_tuple(x1 , x2 , ...)
                               )
            )
但是,我想执行一个排序,每个长度大于10个序列N。推力不支持 大小>=10的元组。有办法解决这个问题吗

当然,可以保留
键的单独副本
向量并执行
对10个序列的串进行排序。但是我想在一个调用中完成所有操作。

推力::tuple
是硬编码的,总是有10个元素,因此没有一种直接的方法可以从十多个单独的迭代器中形成一个
zip_迭代器,因此在一个融合操作中无法按键对十多个不同的迭代器进行排序(并且隐式地不能将超过10个迭代器传递给用户函子)

如果您真的想不出一种有用的方法来将一些单独的向量组合成一个迭代器(例如,形成一个元组值向量),那么另一种方法可能是使用置换迭代器。如果您从计数迭代器创建一个数组并对其排序,例如:

device_vector<int> indices(N);
copy(make_counting_iterator(0), make_counting_iterator(N), indices.begin());
sort_by_key(key, key+N, indices);
设备向量索引(N);
复制(make_counting_iterator(0),make_counting_iterator(N),index.begin());
按_键对_进行排序(键,键+N,索引);

索引
现在将有序索引保存到本来可以排序的向量中。然后,您可以创建一个置换迭代器,用于“聚集”作为后续算法调用的一部分,按键输入数据。您可以根据需要创建任意多个置换迭代器,它们可以是zip迭代器的置换,以便在后续代码中根据需要提供12个输入迭代器的不同“视图”。

实际上,您可以使用简单的“分散”操作。只执行一个“推力::按_键排序”操作,然后对每个数据向量应用“推力::分散”操作。值将分布到相应的位置

thrust::sequence(indices.begin(), indices.end());
thrust::sort_by_key(keyvals.begin(), keyvals.end(), indices.begin());

//now indices keep the locations of the sorted key values
foreach ( ... ) {
    thrust::scatter(data.begin(), data.end(), indices.begin(), sorteddata.begin());
}

聚集和分散操作非常强大,并提供了许多机会。

每个元组需要多少个值?我需要一个元组中的12个元素。您的第二个代码片段在功能上与我提出的公认答案完全相同。我不理解第一个代码中的术语。如何
索引
排序数据ta
与原始问题有关吗?我对答案做了一些更新。实际上是因为分散操作不到位(不是吗?)我们需要另一个向量来保存输出。如果在继续操作中按顺序访问值,则将结果存储在另一个向量可能会导致更好的合并?否则,使用置换迭代器是更好的选择:)