私はCUDAを初めて使っています。 私はGPU上でトライデータ構造を実装しようとしていましたが、動作しませんでした。私は自分の原子に気付きましたが、私の予想どおりに機能していません。 私はatomicAddでいくつかの実験を行いました。 CUDAのプログラミングガイドに従って -各atomicAddの後に変数値の異なる/固有の出力が表示されないのはなぜですか?
1:(アトミック機能上)
..
が私を修正し、私はこのコードについて間違っている:私は、コードのこの作品を書きました。 操作が#include <cstdio> //__device__ int *a; //I also tried the code with using this __device__ //variable and allocating it inside kernel instead //using cudaMalloc. Same Result __global__ void AtomicTestKernel (int*a) { *a = 0; __syncthreads(); for (int i = 0; i < 2; i++) { if (threadIdx.x % 2) { atomicAdd(a, 1); printf("threadsIndex = %d\t&\ta : %d\n",threadIdx.x,*a); } else { atomicAdd(a, 1); printf("threadsIndex = %d\t&\ta : %d\n", threadIdx.x, *a); } } } int main() { int * d_a; cudaMalloc((void**)&d_a, sizeof(int)); AtomicTestKernel << <1, 10 >> > (d_a); cudaDeviceSynchronize(); return 0; }
2完了するまで、言い換えれば、他のスレッドは、このアドレスにアクセスすることはできません - int * d_a
のグローバル・メモリに常駐するので、カーネルの入力である:cudaMalloc
を使用して割り当てられ、そのためint * a
(この3分間のビデオによればUdacity CUDA - Global Memory)、したがって、すべてのスレッドが同じint * a
なく、それらの各々を見ている持っている自だ
3 - 前のコードと同じように、printf
にはatomicAdd
がありますので、これらのそれぞれは、*a
の値が以前のものと異なり、ユニークであると期待しています。
しかし、私は私が*a
のように多くの同じ変数を参照してください取得した結果では、これは私が得る結果である:すべての命令はあなたのコードがすべて実行されているワープ内の同じ時間に実行されるため
threadsIndex = 0 & a : 5
threadsIndex = 2 & a : 5
threadsIndex = 4 & a : 5
threadsIndex = 6 & a : 5
threadsIndex = 8 & a : 5
threadsIndex = 1 & a : 10
threadsIndex = 3 & a : 10
threadsIndex = 5 & a : 10
threadsIndex = 7 & a : 10
threadsIndex = 9 & a : 10
threadsIndex = 0 & a : 15
threadsIndex = 2 & a : 15
threadsIndex = 4 & a : 15
threadsIndex = 6 & a : 15
threadsIndex = 8 & a : 15
threadsIndex = 1 & a : 20
threadsIndex = 3 & a : 20
threadsIndex = 5 & a : 20
threadsIndex = 7 & a : 20
threadsIndex = 9 & a : 20
Press any key to continue . . .
ありがとう!うん、私はそれを試み、私はユニークな値を見た。 – Ardeshir81