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

このコードが行うことを期待しているのは、fooVec と barVec の順序を維持しながら、keyVec の値に基づいて並べ替えることです (これは適切に行われます)。これは sort_by_key の機能ではありませんか? sort_by_key は zip_iterator で動作しますか? 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_iterator で動作させることはできませんが、標準の throw::device_vector<>.begin() イテレーターでは正しく動作します。

4

1 に答える 1

3

thrust::sort_by_keyzip_iteratorあなたの例のようにソートできるはずです。

いくつかの異なるプラットフォームのいずれかで説明されている動作を再現できませんでしたが、問題を引き起こすシステムに固有の何かがある可能性があります.

開発者が詳しく調べられるようにtestfile.cu、システムの内容と詳細をGoogle Code の Thrust のバグ トラッカーに投稿する必要があります。

于 2012-03-02T19:31:23.833 に答える