1

我正在尝试在 cuda 中使用带有 sort_by_key() 的 zip_iterator,并且 zip_iterator 中的值在排序期间没有重新排序(数据的位置与原来的位置相同)。

示例代码:

typedef thrust::device_vector<int> IntVec;
IntVec keyVec(100);
IntVec fooVec(100);
IntVec barVec(100);
for (int z = 0; z < 100; z++)
{
   keyVec[z] = rand();
   fooVec[z] = z;
   barVec[z] = z;
}
thrust::sort_by_key( keyVec.begin(), keyVec.end(),
                     thrust::make_zip_iterator( make_tuple( fooVec.begin(), barVec.begin() ) ) );

我期望这段代码做的是基于 keyVec 中的值(它正确地执行)排序,同时保持 fooVec 和 barVec 的顺序。这不是 sort_by_key 所做的吗?sort_by_key 是否与 zip_iterators 一起使用?从 zip_iterator 设置/提取数据时,我做错了什么吗?如果此方法不正确,保持值排序的正确方法是什么?

前任:

   key,foo,bar (presort)
   3,1,1
   2,2,2
   ...

   key,foo,bar (what i expect post sort)
   2,2,2
   3,1,1
   ...

   key,foo,bar (what i actually get)      
   2,1,1
   3,2,2
   ...

使用 CUDA 4.1 附带的 Thrust

系统详情:

OS: RHEL 6.0 x86_64
CUDA Version: 4.1 (also tested with 4.1.1.5)
Thrust Version: 1.5
GPU: 4x nVidia Corporation GF100 [GeForce GTX 480] (rev a3)  
nvidia driver: 290.10
nvcc version: release 4.1, V0.2.1221
compile string: nvcc testfile.cu

更新:仍然无法让 sort_by_key() 与 zip_iterators 一起使用,但它可以与标准推力::device_vector<>.begin() 迭代器一起正常工作。

4

1 回答 1

3

thrust::sort_by_key应该能够zip_iterator按照您的示例进行排序。

我无法在多个不同平台中的任何一个上重现您描述的行为,但您的系统可能存在一些独特的东西导致问题。

您应该将testfile.cu系统的内容和详细信息发布到Thrust 在 Google Code 上的错误跟踪器,以便开发人员可以仔细查看。

于 2012-03-02T19:31:23.833 回答