0

以下のコードが 1,2 を出力しない理由がわかりませんが、いくつかの乱数が出力されます

#include <thrust/set_operations.h> 
#include <thrust/device_vector.h> 
#include <ostream> 

int main() { 

    int a[]= { 1,2,3,4,5,6};
    int b[] = {1,2,8};
    int *ga, *gb,*gr;
    cudaMalloc((void**)&ga, 6* sizeof(int));
    cudaMalloc((void**)&gb, 3* sizeof(int));
    cudaMalloc((void**)&gr, 3* sizeof(int));
    cudaMemcpy(ga, a, 6 * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(gb, b, 3 * sizeof(int), cudaMemcpyHostToDevice);
    thrust::device_ptr<int> end;
    thrust::device_ptr<int> gaptr(ga);
    thrust::device_ptr<int> gbptr(gb);
    thrust::device_ptr<int> grptr(gr);
    end = thrust::set_intersection(gaptr, gaptr+6, gbptr, gbptr+3,grptr);

    printf("%d ", *grptr);
    grptr++;
    printf("%d ", *grptr);  

getchar();

    return 0;


}

さらに、 begin と end1 を使用して、結果配列のすべての値を反復処理する方法

4

1 に答える 1

0

device_vector への反復子を使用して int の配列を反復処理しようとしています。それは不可能です。ポインターは、演算子 ++ を使用してポインターを進め、* を使用してポインターが指す値にアクセスできるという意味で、配列の反復子に似ています。イテレータを作成する代わりに、grptr を直接使用できます。

これだけで動作します:

std::cout << *grptr << " ";
grptr++;
std::cout << *grptr << std::endl;

その他の注意事項: を含める場合は printf を使用しないでください。一貫性を保ち、cout を使用します。また、実際に推力を試してみたい場合は、配列を作成する代わりに実際の推力ベクトルを使用して、それらを手動でコピーし、デバイス ポインターでラップすることもできます (推力と cuda ランタイム API 間の相互操作を学習しようとしている場合を除きます)。

編集:編集したコードを試してみましたが、cout が機能している間は実際に printf が機能しません。問題は、thrust::device_ptr は、単項演算子* がオーバーロードされたクラスであり、その戻り値の型が Thrust::device_reference であるということです。

ドキュメントから:

template<typename T> __host__ __device__ reference thrust::device_ptr<T>::operator*(void) const

このメソッドは、この device_ptr を逆参照します。

戻り値: この device_ptr が指すオブジェクトを参照する device_reference。

目的の値を正しく出力するには、int にキャストするだけです。

printf("%d ", (int)*grptr);
grptr++;
printf("%d ", (int)*grptr);

クラス throw::device_reference の最初の説明では、解決策がキャストであることを示す printf の例を挙げています。ここで確認できますhttp://wiki.thrust.googlecode.com/hg/html/classthrust_1_1device__reference.html

于 2011-10-27T09:01:46.563 に答える