このソースコードでは、4つのthredsがあります。カーネル関数は10個の配列すべてにアクセスできます。どうやって?
我々は10件のスレッドの元を作成しないのはなぜ
#define N 10 //(33*1024)
__global__ void add(int *c){
int tid = threadIdx.x + blockIdx.x * gridDim.x;
if(tid < N)
c[tid] = 1;
while(tid < N)
{
c[tid] = 1;
tid += blockDim.x * gridDim.x;
}
}
int main(void)
{
int c[N];
int *dev_c;
cudaMalloc((void**)&dev_c, N*sizeof(int));
for(int i=0; i<N; ++i)
{
c[i] = -1;
}
cudaMemcpy(dev_c, c, N*sizeof(int), cudaMemcpyHostToDevice);
add<<< 2, 2>>>(dev_c);
cudaMemcpy(c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost);
for(int i=0; i< N; ++i)
{
printf("c[%d] = %d \n" ,i, c[i]);
}
cudaFree(dev_c);
}
)add<<<2,5>>> or add<5,2>>>
Nは10元)33×1024よりも大きい場合、我々は、スレッドの適度に小さい数を作成する必要があるため。
このソースコードはこのケースの例です。 アレイは10、uddaスレッドは4です。 10個のアレイすべてにアクセスするには、4つのスレッドのみを使用します。
cudaの詳細でthreadIdx、blockIdx、blockDim、gridDimの意味についてのページを参照してください。このソースコードで
2 * 2(ブロック*スレッド)ので、スレッドの
gridDim.x : 2 this means number of block of x
gridDim.y : 1 this means number of block of y
blockDim.x : 2 this means number of thread of x in a block
blockDim.y : 1 this means number of thread of y in a block
我々の数は、4です。
追加カーネル関数で
、我々がアクセスすることができます0、1、2、スレッドの3指標
- >tid = threadIdx.x + blockIdx.x * blockDim.x
①0+ 0×2 = 0
②1+ 0 * 2 = 1
③0+ 1 * 2 = 2
④1+ 1 * 2 = 3
どのようにトン指標4、5、6、7、8のOアクセス残り、9 カーネルのwhileループ
tid += blockDim.x + gridDim.x in while
**最初の呼び出し**
-1ループにおける計算がある:0+ 2×2 = 4
-2ループ:4 + 2×2 = 8
-3ループ:8 + 2 * 2 = 12
(ただし、この値はながらうち、偽であります!) **カーネルの第2の呼び出し**
-1ループ:1 + 2 * 2 = 5
-2ループ:5 + 2×2 = 9
-3ループ:+ 2 9 * 2 = 13(ただし、この値が偽であります、一方アウト)カーネルの
**第コール**
-1ループ:2 + 2×2 = 6
-2ループ:6 + 2×2 = 10(これ値はfalseですが、out!)
**カーネルの第四の呼び出し**
-1ループ:3 + 2×2 = 7
-2ループ:7 + 2 * 2 = 11(!しかし、この値は、一方アウト偽)
だから、0、1、2、3、4、5、6、7、8、9のすべてのインデックスは、TID値によってアクセスすることができます。
このページを参照してください。 http://study.marearts.com/2015/03/to-process-all-arrays-by-reasonably.html 評判が低いため、画像をアップロードできません。
あなたの答えはより良いと言えます。+1 – alrikai
@alrikai私は単純に答えにいくつかのコメントを追加していましたあなたはそれを削除しました。 (そして、後であなたは再投稿しました。)あなたが最初で、あなたの答えは大丈夫です。 –
うん、私は間違ってそれを書いている途中で投稿していた。 – alrikai