使用zip_iterator值时,请注意sort_by_key问题

时间:2012-03-02 05:45:28

标签: cuda thrust

我正在尝试将zip_iterator与cuda中的sort_by_key()一起使用,并且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() ) ) );

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

EX:

   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,但它可以使用标准的thrust :: device_vector&lt;&gt; .begin()迭代器正常工作。

1 个答案:

答案 0 :(得分:3)

thrust::sort_by_key应该能够以您的示例的方式对zip_iterator进行排序。

我无法重现您在几个不同平台上所描述的行为,但您的系统可能存在一些独特的问题。

您应该将testfile.cu的内容和系统的详细信息发布到Thrust's bug tracker on Google Code,以便开发人员仔细查看。