0

重複の可能性:
ポインターを含む構造体を CUDA デバイスにコピーする

デバイスに割り当てられた配列を指すデバイス ポインターの構造があります。このような

struct mystruct{

int* dev1;
double* dev2;
.
.
}

この構造には多数の配列があります。私はポインタを渡した CUDA カーネルの作成を開始しmystruct、CUDA カーネル コード内でこのように逆参照しましたmystruct->dev1[i]

mystructしかし、CUDA の第一原則により、CUDA カーネル内でホスト ポインター (この場合は ) を参照解除できないため、これは機能しないことに数行書いた後で気付きました。

しかし、カーネルに多数の引数を渡さなければならないので、これはちょっと不便です。これを回避する方法はありますか。カーネル呼び出しの引数の数をできるだけ短くしたいと考えています。

4

3 に答える 3

2

この回答で説明しているように、構造体を値でカーネルに渡すことができるため、ホストポインターの逆参照について心配する必要はありません。

__global__ void kernel(mystruct in)
{
  int idx = threadIdx.x + blockIdx.x * blockDim.x;
  in.dev1[idx] *= 2;
  in.dev2[idx] += 3.14159;
}

注意すべき値で構造体を渡すオーバーヘッドがあります。ただし、構造体が大きすぎない場合は、問題にはなりません。

同じ構造体を多くのカーネルに渡す場合、または繰り返し渡す場合は、alandが提案する代わりに、構造体自体をグローバルメモリまたは定数メモリにコピーするか、MarkEbersoleが提案するようにマップされたホストメモリを使用することを検討してください。しかし、構造体を値で渡すことは、開始するためのはるかに簡単な方法です。

(注:質問を複製する前にStackOverflowを検索してください...)

于 2012-09-13T02:49:32.483 に答える
0

セットアップがサポートしている場合は、ページロック (固定) ホスト メモリを使用して、その領域内に構造を作成することもできます。CUDA プログラミング ガイドの 3.2.4 を参照してください。

于 2012-09-12T21:04:45.623 に答える
0

構造体をグローバル メモリにコピーし、mystructそのデバイス アドレスをカーネルに渡すことができます。

ただし、パフォーマンスの観点からは、mystruct多くのスレッドによるランダムな読み取りが多数あるため、定数メモリに格納する方がよいでしょう。

于 2012-09-12T19:08:49.977 に答える