에서 벡터 덧셈 계산되지 않은 코드이다 : 기본적일부 요소 쿠다
#include "common/book.h"
#define N 36
__global__ void add(int *a, int *b, int *c) {
int tid = blockIdx.x * gridDim.y * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;
if(tid < N) {
c[tid] = a[tid] + b[tid];
}
}
int main() {
int a[N], b[N], c[N];
int *dev_a, *dev_b, *dev_c;
cudaMalloc((void**) &dev_a, N * sizeof(int));
cudaMalloc((void**) &dev_b, N * sizeof(int));
cudaMalloc((void**) &dev_c, N * sizeof(int));
for (int i = 0; i < N; i++) {
a[i] = -1;
b[i] = i * i;
}
cudaMemcpy(
dev_a,
a,
N * sizeof(int),
cudaMemcpyHostToDevice
);
cudaMemcpy(
dev_b,
b,
N * sizeof(int),
cudaMemcpyHostToDevice
);
dim3 grid_dim(3, 2);
dim3 block_dim(3, 2);
add<<<grid_dim, block_dim>>>(dev_a, dev_b, dev_c);
cudaMemcpy(
c,
dev_c,
N * sizeof(int),
cudaMemcpyDeviceToHost
);
for (int i = 0; i < N; i++) {
printf("%d + %d = %d\n", a[i], b[i], c[i]);
}
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
}
, I는 3 × 2 레이아웃 그리드에 소자 현명한 개의 벡터를 추가하려고하고, 각 블록 그리드는 스레드의 3x2 레이아웃을 갖는다.
-1 + 0 = -1
-1 + 1 = 0
-1 + 4 = 3
-1 + 9 = 8
-1 + 16 = 15
-1 + 25 = 24
-1 + 36 = 0
-1 + 49 = 0
-1 + 64 = 0
-1 + 81 = 0
-1 + 100 = 0
-1 + 121 = 0
-1 + 144 = 143
-1 + 169 = 168
-1 + 196 = 195
-1 + 225 = 224
-1 + 256 = 255
-1 + 289 = 288
-1 + 324 = 0
-1 + 361 = 0
-1 + 400 = 0
-1 + 441 = 0
-1 + 484 = 0
-1 + 529 = 0
-1 + 576 = 575
-1 + 625 = 624
-1 + 676 = 675
-1 + 729 = 728
-1 + 784 = 783
-1 + 841 = 840
-1 + 900 = 0
-1 + 961 = 0
-1 + 1024 = 0
-1 + 1089 = 0
-1 + 1156 = 0
-1 + 1225 = 0
은 분명히 일부 블록은 단지 무시된다 : 내가 컴파일 된 바이너리를 실행하면 다음
는 결과이다. 나는 또한
tid
이 커널 함수
add
에서 계산되는 방법을 가지고 놀려고 시도했지만 항상 누락 된 블록이 있습니다.
제안 사항?