gpt4 book ai didi

cuda - 我的 CUDA 内核中的 printf() 不会产生任何输出

转载 作者:行者123 更新时间:2023-12-03 18:36:01 56 4
gpt4 key购买 nike

我添加了一些 printf()我的 CUDA 程序中的语句

__device__ __global__ void Kernel(float *, float * ,int );
void DeviceFunc(float *temp_h , int numvar , float *temp1_h)
{ .....
//Kernel call
printf("calling kernel\n");
Kernel<<<dimGrid , dimBlock>>>(a_d , b_d , numvar);
printf("kernel called\n");
....
}

int main(int argc , char **argv)
{ ....
printf("beforeDeviceFunc\n\n");
DeviceFunc(a_h , numvar , b_h); //Showing the data
printf("after DeviceFunc\n\n");
....
}

同样在 Kernel.cu 中,我写道:
#include<cuda.h>
#include <stdio.h>
__device__ __global__ void Kernel(float *a_d , float *b_d ,int size)
{
int idx = threadIdx.x ;
int idy = threadIdx.y ;
//Allocating memory in the share memory of the device
__shared__ float temp[16][16];

//Copying the data to the shared memory
temp[idy][idx] = a_d[(idy * (size+1)) + idx] ;
printf("idx=%d, idy=%d, size=%d", idx, idy, size);
....
}

然后我使用 -arch=sm_20 进行编译像这样:
nvcc -c -arch sm_20 main.cu
nvcc -c -arch sm_20 Kernel.cu
nvcc -arch sm_20 main.o Kernel.o -o main

现在,当我运行程序时,我看到:
beforeDeviceFunc

calling kernel
kernel called
after DeviceFunc

所以 printf()内核内部没有打印。我该如何解决?

最佳答案

printf()仅当内核成功完成时才会显示输出,因此请检查所有 CUDA 函数调用的返回码并确保没有报告错误。
此外printf()输出仅显示在程序中的某些点。 Appendix B.32.2 of the Programming Guide将这些列为

  • 通过 <<<>>> 启动内核或 cuLaunchKernel() (在启动开始时,如果 CUDA_LAUNCH_BLOCKING 环境变量设置为 1,在启动结束时也是如此),
  • 通过cudaDeviceSynchronize()同步, cuCtxSynchronize() , cudaStreamSynchronize() , cuStreamSynchronize() , cudaEventSynchronize() , 或 cuEventSynchronize() ,
  • 通过 cudaMemcpy*() 的任何阻塞版本进行内存复制或 cuMemcpy*() ,
  • 通过 cuModuleLoad() 加载/卸载模块或 cuModuleUnload() ,
  • 通过 cudaDeviceReset() 销毁上下文或 cuCtxDestroy() .
  • 在执行 cudaStreamAddCallback() 添加的流回调之前或 cuStreamAddCallback() .

  • 要检查这是您的问题,请在内核调用之后添加以下代码:
    {
    cudaError_t cudaerr = cudaDeviceSynchronize();
    if (cudaerr != cudaSuccess)
    printf("kernel launch failed with error \"%s\".\n",
    cudaGetErrorString(cudaerr));
    }
    然后,您应该会看到内核的输出或错误消息。
    更方便, cuda-memcheck 如果您在其下运行可执行文件,它将自动为您检查所有返回码。虽然您应该始终检查错误,但这在解决具体问题时会派上用场。

    关于cuda - 我的 CUDA 内核中的 printf() 不会产生任何输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13320321/

    56 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com