按键排序> 10个整数序列。有推力

时间:2012-09-08 00:41:17

标签: cuda thrust

我想执行sort_by_key,其中我只有一个键序列 和多个价值序列。

通常用

执行此操作
sort_by_key(
             key, 
             key + N, 
             make_zip_iterator(
                                make_tuple(x1 , x2 , ...)
                               )
            )

但是我想用>进行排序每个长度为N的10个序列。推力不支持 大小> = 10的元组。那么这有什么方法吗?

当然,可以保留key向量的单独副本并执行 排序10个序列。但我想一次性完成所有工作。

2 个答案:

答案 0 :(得分:1)

thrust::tuple被硬编码为总是有10个元素,因此没有直接的方法可以从十多个单独的迭代器中形成zip_iterator,因此无法对超过10个不同的迭代器进行排序通过单个融合操作中的键(并且隐式地无法将超过10个迭代器传递给用户仿函数)。

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

device_vector<int> indices(N);
copy(make_counting_iterator(0), make_counting_iterator(N), indices.begin());
sort_by_key(key, key+N, indices);

indices现在将有序索引保存到您原本要排序的向量中。然后,您可以创建一个置换迭代器,该迭代器可用于通过您的密钥“收集”输入数据,作为后续算法调用的一部分。您可以根据需要生成尽可能多的置换迭代器,它们可以是zip迭代器的排列,以便在后续代码中提供12个输入迭代器的不同“视图”。

答案 1 :(得分:0)

实际上你可以使用简单的“分散”操作。只执行一次“thrust :: sort_by_key”操作,然后对每个数据向量应用“thrust :: scatter”操作。这些值将分配到相应的位置。

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());
}

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