2012-03-02 11 views
1

私は、cudaでsort_by_key()を使用してzip_iteratorを使用しようとしていますが、zip_iterator内の値はソート中に並べ替えられません元々あった)。zip_iterator値を使用すると、推論sort_by_keyの問題が発生する

例コード:fooVecとbarVecの秩序を維持しながら、私はこのコードが何を期待するもの

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の値に基づいています。これはsort_by_keyの機能ではありませんか? sort_by_keyはzip_iteratorsで動作しますか? zip_iteratorからデータをセット/プルするときに間違ったことをしていますか?このメソッドが正しくない場合、値の順序を保持する適切なメソッドは何ですか?

EX:

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 

UPDATE: はまだsort_by_key取得することはできません()zip_iteratorsで動作するが、それは動作するCUDA 4.1に同梱

システムの詳細は、スラストを使用し

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 
    ... 

標準のthrust :: device_vector <> .begin()イテレータで正しく動作します。

+0

'make_tuple()'の代わりに 'thrust :: make_tuple()'を使うと違いがありますか? – harrism

+0

thrust :: make_tuple()を使用しても違いはありません – NothingMore

+0

これはうまくいくはずです。 @ NothingMore:あなたのシステムの詳細は何ですか?(OS、ハードウェア、デバッグ/リリースモードなど) –

答えて

3

thrust::sort_by_keyは、例の方法でzip_iteratorをソートできるはずです。

さまざまなプラットフォームで説明されている動作を再現できませんでしたが、システムに固有の問題が発生する可能性があります。

testfile.cuの内容とシステムの詳細をThrust's bug tracker on Google Codeに投稿して、開発者がより詳しく見るようにしてください。

+0

お試しいただきありがとうございます。 Ivは実際に私が使用している特定のマシンで問題を見つけることができました。このマシンではスケジューリングにトルクを使用し、デフォルトではgpuモードをexclusive_threadモードに設定していました。ジョブを起動するときにこのモードをexclusive_processに変更すると、問題が修正されたように見えます(値は正しく並べ替えられています)。 – NothingMore

+0

exclusive_threadモードとexclusive_threadモードの違いはわかりませんが、キーではなくソートされた値がソートされることは私には間違っています... – harrism

+0

exclusive_threadトルクドッグから収集したものからのみです単一のユーザスレッドが実際にGPU呼び出しを行うことができます。しかし、これは使用しているシステムで不適切に設定されている可能性があります(明らかにnvidiaドライバのみでサポートされているかなり新しい機能ですので、まだトルクにバグが残っている可能性があります)。 – NothingMore

関連する問題