0

CUDAの共有/ローカルメモリに関しては、まだ少しわかりません。現在、私はカーネルを持っています。カーネル内で、各スレッドはリストオブジェクトを割り当てます。このようなもの

__global__ void TestDynamicListPerThread()
{
    //Creates a dynamic list (Each thread gets its own list)
    DynamicList<int>  dlist(15);

    //Display some ouput information
    printf("Allocated a new DynamicList, size=%d, got pointer %p\n", dlist.GetSizeInBytes(),dlist.GetDataPtr());

    //Loops through and inserts multiples of four into the list
    for (int i = 0; i < 12; i++)
        dlist.InsertAtEnd(i*4);
}

私の現在の理解では、各スレッドはdlistローカルメモリに保存されますが、これは本当ですか?その場合、カーネルの実行の最後にdlist(別のカーネルから)各オブジェクトを取得する方法はありますか、それとも__shared__最初のスレッドによって割り当てられた動的リストの配列を使用する必要がありますか?

少し複雑すぎるかもしれませんが、リストを変更する必要はありません。私が達成しようとしている実行は、次のようになります。

  1. リストを作成する(GPUでのみ実行)
  2. 各リストから出力を生成します(GPUで、各スレッドによって実行され、そのスレッドに割り当てられたリストからの情報のみが必要です)。
  3. リストの変更/交換(GPUで引き続き実行)
  4. ホストでいくつかのブレーク条件が満たされるまで、2と3を繰り返します

前もって感謝します!

4

1 に答える 1

1

私の現在の理解では、各スレッドはローカルメモリに格納された独自のdlistを取得しますが、これは本当ですか?

それは正しいです。ローカル変数はスレッドごとに作成されます。それらはレジスターまたはローカル・メモリーのいずれかに保管され、変数の終わりは主にコンパイラーに依存します。

その場合、カーネルの実行の最後に(別のカーネルから)各dlistオブジェクトを取得する方法はありますか、それとも__shared__最初のスレッドによって割り当てられた動的リストの配列を使用する必要がありますか?

ローカルメモリはスレッド専用です(例外:コンピューティング機能3.0以降、ワープ内のスレッド間でスレッドローカル変数の交換を容易にするワープ内命令がいくつかあります)。そのため、ローカル変数をグローバルメモリにコピーする必要があります。カーネルの外部で値を取得する必要がある場合は変数。 __shared__メモリはスレッドブロックごとに割り当てられ、そのスレッドブロック内でのみアクセスできるため、値をグローバルメモリの場所にコピーする必要があります。

おそらく必要なのは、パラメータとしてカーネルに渡すリストのグローバル配列のようなものです。

于 2013-01-20T00:27:22.310 に答える