cuda打印更多行,即使循环数相同
我正在探索cuda,但它的输出似乎比它应该打印的更多cuda打印更多行,即使循环数相同,cuda,Cuda,我正在探索cuda,但它的输出似乎比它应该打印的更多 __global__ void gpu_Floyd(int *result, int N, int k) { int j; int Row = blockIdx.y * blockDim.y + threadIdx.y; int Col; if(Row < N) { #if __CUDA_ARCH__>=200 printf("row value: %d
__global__ void gpu_Floyd(int *result, int N, int k)
{
int j;
int Row = blockIdx.y * blockDim.y + threadIdx.y;
int Col;
if(Row < N)
{
#if __CUDA_ARCH__>=200
printf("row value: %d, blkId : %d, blkDim : %d, thread : %d \n", Row, blockIdx.y, blockDim.y, threadIdx.y);
#endif
}
}
//CUDA Portion
int Grid_Dim_x = 1, Grid_Dim_y = 1;
int Block_Dim_x = 2, Block_Dim_y = 2;
//int noThreads_x, noThreads_y;
int *result = (int*)malloc(sizeof(int)*N*N);
int *d_result;
memcpy(result, mat, sizeof(int)*N*N);
dim3 Grid(Grid_Dim_x, Grid_Dim_y);
dim3 Block(Block_Dim_x, Block_Dim_y, 1);
cudaMalloc((void **)&d_result, N*N);
int k;
cudaMemcpy(d_result, result, N * N, cudaMemcpyHostToDevice);
for(k = 0; k < 2; k++)
{
gpu_Floyd<<<Grid, Block>>>(d_result, N, k);
}
cudaMemcpy(result, d_result, N*N, cudaMemcpyDeviceToHost);
输出不应该只有2行而不是8行,因为for循环只迭代两次吗?块维度和网格维度如何影响我的输出
我希望最终输出仅为
row value: 0, blkId : 0, blkDim : 2, thread : 0
row value: 1, blkId : 0, blkDim : 2, thread : 1
您的
网格
变量为(1,1),表示您正在启动一个块。
Block
变量为(2,2),意味着您要启动2x2个线程,即每个块总共4个线程。因为只有一个块,所以总共要启动4个线程
\uuuu全局\uuuu
内核中的代码由每个线程执行。因此,每个线程将(单独)在内核中执行对printf
的调用。因此,对于内核的每次执行,总共有4次调用printf
(每个线程一次)
由于您要两次启动内核,因此,printf
总共生成了8行输出
该行为是预期的。您的问题很好,因为它有相当完整的代码,并且您列出了获得的输出和预期的输出。但实际上,在提出有关堆栈溢出的问题之前,您应该先从文档中获取一些知识。我投票决定结束辩论,理由是你对这件事没有表现出丝毫的了解。我同意罗杰的观点。经典的“CUDA的例子”一书将顺利地向您介绍GPU上的并行编程主题。
row value: 0, blkId : 0, blkDim : 2, thread : 0
row value: 1, blkId : 0, blkDim : 2, thread : 1