Cuda blockDim.y 总是 ==1
Cuda blockDim.y always ==1
我总是得到 blockdim.y ==1。无论我在 numBlocks 中设置什么值,我总是得到相同的值。
__global__ void CalcVideo(unsigned char *original, unsigned char *candidate, int *answer)
{
printf("block id.x = %d blockid.y=%d blockdim.x = %d blockdim.y = %d Thread id= %d \n",
blockIdx.x, blockIdx.y, blockDim.x, blockDim.y, threadIdx.x );
}
int ORIGINAL_FRAMES = 3;
int CANDIDATE_FRAMES = 2;
int FRAME_LENGHT = 3;
dim3 numBlocks(ORIGINAL_FRAMES, CANDIDATE_FRAMES);
dim3 threadsPerBlock(3); // 64 threads
CalcVideo << <numBlocks, threadsPerBlock >> >(original_device, candidate_device, answer_device);
Num of y.blokcs 执行正确,但为什么程序给我错误的 blockdim.y 大小?
block id.x = 1 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 0
block id.x = 1 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 1
block id.x = 1 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 2
block id.x = 1 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 0
block id.x = 1 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 1
block id.x = 1 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 2
block id.x = 0 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 0
block id.x = 0 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 1
block id.x = 0 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 2
block id.x = 0 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 0
block id.x = 0 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 1
block id.x = 0 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 2
block id.x = 2 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 0
block id.x = 2 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 1
block id.x = 2 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 2
block id.x = 2 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 0
block id.x = 2 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 1
block id.x = 2 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 2
blockDim
存储一个块的维度。在您的情况下,您将 threadsPerBlock
作为块维度传递,这使其成为 3 x 1 x 1
。内核调用的第一个参数,在你的例子中是 numBlocks
,它控制块的 网格 的维度——你可以在内核中作为 gridDim
访问它。
旁注:我假设问题中极低的块数和大小仅用于测试目的,因为它们会使任何 GPU 在实践中极度未得到充分利用。
我总是得到 blockdim.y ==1。无论我在 numBlocks 中设置什么值,我总是得到相同的值。
__global__ void CalcVideo(unsigned char *original, unsigned char *candidate, int *answer)
{
printf("block id.x = %d blockid.y=%d blockdim.x = %d blockdim.y = %d Thread id= %d \n",
blockIdx.x, blockIdx.y, blockDim.x, blockDim.y, threadIdx.x );
}
int ORIGINAL_FRAMES = 3;
int CANDIDATE_FRAMES = 2;
int FRAME_LENGHT = 3;
dim3 numBlocks(ORIGINAL_FRAMES, CANDIDATE_FRAMES);
dim3 threadsPerBlock(3); // 64 threads
CalcVideo << <numBlocks, threadsPerBlock >> >(original_device, candidate_device, answer_device);
Num of y.blokcs 执行正确,但为什么程序给我错误的 blockdim.y 大小?
block id.x = 1 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 0
block id.x = 1 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 1
block id.x = 1 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 2
block id.x = 1 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 0
block id.x = 1 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 1
block id.x = 1 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 2
block id.x = 0 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 0
block id.x = 0 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 1
block id.x = 0 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 2
block id.x = 0 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 0
block id.x = 0 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 1
block id.x = 0 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 2
block id.x = 2 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 0
block id.x = 2 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 1
block id.x = 2 blockid.y=1 blockdim.x = 3 blockdim.y = 1 Thread id= 2
block id.x = 2 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 0
block id.x = 2 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 1
block id.x = 2 blockid.y=0 blockdim.x = 3 blockdim.y = 1 Thread id= 2
blockDim
存储一个块的维度。在您的情况下,您将 threadsPerBlock
作为块维度传递,这使其成为 3 x 1 x 1
。内核调用的第一个参数,在你的例子中是 numBlocks
,它控制块的 网格 的维度——你可以在内核中作为 gridDim
访问它。
旁注:我假设问题中极低的块数和大小仅用于测试目的,因为它们会使任何 GPU 在实践中极度未得到充分利用。