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

我正在探索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, 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