2012-12-11 2 views
0
dim3 DimGrid((n-1)/256 + 1, 1, 1); 
dim3 DimBlock(256, 1, 1); 
vecAddKernel<<<DimGrid,DimBlock>>>(d_A, d_B, d_C, n); 
__global__ 
void vecAddkernel(float* A, float* B, float* C, int n) 
{ 
int i = threadIdx.x + blockDim.x * blockIdx.x; 
if(i<n) C[i] = A[i] + B[i]; 
} 

위의 함수에서 길이 n = 257의 벡터가 있다고 가정하면 2 개의 블록 만 할당됩니다. vecAddkernel 함수가 호출 될 때 두 번째 블록에서 어떤 일이 발생하는지 알고 싶었습니다. 255 개의 스레드가 출력되지 않지만 두 번째 블록에서 하나의 스레드 만 실행되거나 256 개의 스레드가 모두 실행됩니다. 그래서 기본적인 질문은 매개 변수 'n'이 각 vecAddKernel 호출에 대해 어떻게 고정되어 있는가입니다. 모든 블록에 대해 256이나 첫 번째 블록에 256, 두 번째 블록에 대해 1입니까?CUDDA에서 올바른 스레드 양을 실행하는 방법

답변

5

블록에서 실행되는 스레드의 수는 블록의 차원에 의해서만 결정되므로 256 개의 스레드가 실행되지만 255 개에는 "출력"이 없습니다. 또한 'n'은 그리드의 치수 만 정의하고 그리드의 각 블록에 같은 수의 스레드가 있습니다.

관련 문제