CUDA 스레드/블록 및 어레이에 대해 여러 번 읽었지만 여전히 CUDA가 커널 기능을 위해 다중 스레드를 실행하기 시작하는 시점과 시점을 이해하지 못합니다. 호스트가 커널 함수를 호출하거나 커널 함수를 호출 할 때.CUDA : 스레드 및 배열 할당
예를 들어,이 예가 있습니다. 간단히 배열을 조 변경합니다. (그래서,이 배열의 값을 다른 배열에 복사합니다).
__global__
void transpose(float* in, float* out, uint width) {
uint tx = blockIdx.x * blockDim.x + threadIdx.x;
uint ty = blockIdx.y * blockDim.y + threadIdx.y;
out[tx * width + ty] = in[ty * width + tx];
}
int main(int args, char** vargs) {
/*const int HEIGHT = 1024;
const int WIDTH = 1024;
const int SIZE = WIDTH * HEIGHT * sizeof(float);
dim3 bDim(16, 16);
dim3 gDim(WIDTH/bDim.x, HEIGHT/bDim.y);
float* M = (float*)malloc(SIZE);
for (int i = 0; i < HEIGHT * WIDTH; i++) { M[i] = i; }
float* Md = NULL;
cudaMalloc((void**)&Md, SIZE);
cudaMemcpy(Md,M, SIZE, cudaMemcpyHostToDevice);
float* Bd = NULL;
cudaMalloc((void**)&Bd, SIZE); */
transpose<<<gDim, bDim>>>(Md, Bd, WIDTH); // CALLING FUNCTION TRANSPOSE
cudaMemcpy(M,Bd, SIZE, cudaMemcpyDeviceToHost);
return 0;
}
는
나는 기능 tranpose
를 호출 라인을 제외하고 main 함수의 모든 라인을 이해하고있다 (나는 중요하지, 단지 기능 전치 전화 라인이있는 모든 라인을 댓글을 달았). 내가 말할 때 사실입니까? 우리가 함수 transpose<<<gDim, bDim>>>(Md, Bd, WIDTH)
을 호출하면 CUDA는 배열의 각 요소를 하나의 스레드 (및 블록)에 자동으로 할당하고 "한 번에"호출하면 CUDA는 gDim * bDim
번 스레드를 gDim * bDim
스레드에서 실행합니다.
이 점은 자바 멀티 스레드를 좋아하지 않기 때문에 내가 가르쳐주세요.
감사합니다 :)