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() イテレーターでは正しく動作します。