1

複数の GPU で異なる CUDA アルゴリズムの同時実行を管理する Windows 64 ビット アプリケーションを開発しています。

私の設計では、C++ コードの周りでデバイス メモリへのポインターを渡す方法が必要です。(たとえば、それらを私の c++ オブジェクトのメンバーとして覚えておいてください)。__device__修飾子を使用してクラス メンバーを宣言することは不可能であることはわかっています。

__device__ただし、ポインターを通常の C ポインターに割り当ててから、後者を使用することが機能するかどうか、明確な答えを見つけることができませんでした。つまり、次のコードは有効ですか?

__device__ float *ptr;
cudaMalloc(&ptr, size);
float *ptr2 = ptr
some_kernel<<<1,1>>>(ptr2);

私にとっては、コンパイルして正しく動作しましたが、正しいことが保証されているかどうかを知りたいです。

4

1 に答える 1

4

いいえ、そのコードは厳密には有効ではありません。ホスト側では (多かれ少なかれ偶然に) 動作する可能性がありptrますが、デバイス コードから直接逆参照しようとすると、無効な値が含まれていることがわかります。

コードが意味することを行う正しい方法は次のようになります。

__device__ float *ptr;

__global__ void some_kernel()
{
    float val = ptr[threadIdx.x];
    ....
}

float *ptr2;
cudaMalloc(&ptr2, size);
cudaMemcpyToSymbol("ptr", ptr2, sizeof(float *));

some_kernel<<<1,1>>>();

CUDA 4.x 以降の場合は、次のように変更cudaMemcpyToSymbolします。

cudaMemcpyToSymbol(ptr, ptr2, sizeof(float *));

静的デバイス シンボルptrが本当に不要な場合は、次のようにすることができます。

float *ptr2;
cudaMalloc(&ptr2, size);
some_kernel<<<1,1>>>(ptr2);

しかし、おそらくあなたが探しているのは、スラスト ライブラリdevice_ptrクラスのようなものだと思います。これは、裸のデバイス ポインターをラップする優れた抽象化であり、デバイス メモリとホスト メモリの内容をコードで完全に明確にします。

于 2012-07-12T14:27:06.207 に答える