2016-12-23 4 views
0

私は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 . . . 

答えて

3

アトミック命令その後、printfを実行すると、すべてのアトミック操作の結果が読み取られます。ここで

はワープ内の命令のexexutionは次のとおりです。

 
Instruction | threadId 1  | threadId 2  | *a   
____________________________________________________________ 
AtomicAdd | increasing value | waiting   | 1 
       waiting   | increasing value | 2 
---------------------------------------------- Warp finished instruction of all AtomicAdd 
reading *a | read value  | read value  | 2 

アトミック操作の前の値を読み出すための方法の結果を確認し、あなたがここにいくつかの情報を持つことができます

int previousValue = atomicAdd(a, 1); 

をatomicAdd :https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#atomicadd

+0

ありがとう!うん、私はそれを試み、私はユニークな値を見た。 – Ardeshir81

関連する問題