0

我想执行一个sort_by_key我有一个键序列和多个值序列的地方。

一个通常执行此操作

sort_by_key(
             key, 
             key + N, 
             make_zip_iterator(
                                make_tuple(x1 , x2 , ...)
                               )
            )

但是,我想对每个长度为 N 的 > 10 个序列进行排序。推力不支持大小 >= 10 的元组。那么有没有办法解决这个问题?

当然,可以保留一个单独的key向量副本并对 10 个序列的束进行排序。但我想在一个电话中完成所有事情。

4

2 回答 2

1

thrust::tuple被硬编码为始终有 10 个元素,因此没有直接的方法可以zip_iterator从十多个单独的迭代器中形成 a,因此无法在单个融合操作中按键对 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 个输入迭代器的不同“视图”。

于 2012-09-08T09:13:56.263 回答
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());
}

聚散操作非常强大,打开了很多机会。

于 2013-06-04T07:34:18.997 回答