CUDAコードにカーネルがあります。共有メモリのいくつかの部分で多くのスレッドを実行したい(グローバルメモリで実行するよりもはるかに速いため)、その結果をグローバルメモリに書き込みます(私はそれ以降のカーネルで使うことができます)。カーネルはこのようなものになります。CUDAのマルチスレッドカーネルで無駄な書き込み操作が効率的ではありませんか?
__global__ void calc(float * globalmem)
{
__shared__ float sharemem; //initialize shared memory
sharemem = 0; //set it to initial value
__syncthreads();
//do various calculations on the shared memory
//for example I use atomicAdd() to add each thread's
//result to sharedmem...
__syncthreads();
*globalmem = sharedmem;//write shared memory to global memory
}
私は本当に一度だけそれを書くために必要がある場合、すべて単一のスレッドが、グローバルメモリへの共有から外にデータを書き込んでいるという事実を、私に怪しい感じています。私はまた、すべてのスレッドがコードの開始時に共有メモリをゼロに初期化するという事実から同じ感情を得る。現在の実装よりも速い方法がありますか?
!threadIdx.xとはどういう意味ですか? – MuneshSingh
これは単なるCプログラミングの質問です。 'threadIdx.x'は変数です。 C言語では、それが非ゼロであればブール値「真」と見なされる。ブール 'not'演算子の前には' threadIdx.x'変数がゼロのときに条件が真となります。したがって、 'threadIdx.x'変数がゼロであるスレッドを選択します。 –
私は眠い脳に何が起こったのか分かりません!論理的ではないと考えていただけです。 :) – MuneshSingh