2012-12-11 24 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函数时在第二个块中会发生什么。只有一个线程在第二个块中执行,或者所有256个线程都执行,尽管255个线程没有输出。所以最基本的问题是每个vecAddKernel调用的参数'n'是如何确定的?对于每个块是256还是对于第一个块是256,对于第二个块是1?如何在CUDA中执行正确的线程数

回答

5

块中执行多少个线程仅由块的维数决定,因此256个线程执行,尽管255个线程没有“输出”。另外'n'只定义了网格的维度,并且网格的每个块中都有相同数量的线程。