为什么需要包含<stdio.h>才能使用CUDA的printf()?

ein*_*ica 2 c++ printf cuda gpu-programming

我想要printf()CUDA内核中的某些内容。[《编程指南》建议[1]:

#include <stdio.h>

__global__ void helloCUDA(float f)
{
    printf("Hello thread %d, f=%f\n", threadIdx.x, f);
}
Run Code Online (Sandbox Code Playgroud)

但这只是包括标准C库的stdio.h。为什么那是必要的?CUDA的printf()行为与stdio的行为不同printf();我当然不需要那里的所有其他东西。

tal*_*ies 5

这是你并不需要了解其从CUDA语法限制茎的实现细节(基本上是非法的定义不同__device____host__相同功能的版本)。

标准库原型在编译期间用作设备代码中的代理,并且在为受支持的体系结构进行编译时,会使用一些偷偷摸摸的模板重载将设备实现插入设备代码中。

  • 通过设计,CUDA依赖于主机系统的头文件来实现标准C / C ++库功能。这不仅适用于“ printf()”,还适用于设备端的“ malloc()”,“ free()”,“ memset()”以及所有标准数学函数。这样做的原因是希望最大化主机和设备代码之间的互操作性。由于某些CUDA内部头文件还包含一些主机头文件(例如,“ math_functions.h”包括“ math.h”),因此有时您可能会在不包含CUDA程序中的主机头的情况下摆脱困境。您可以提供自己的`printf()`原型,只要它与主机头文件中的原型相匹配。 (3认同)
  • 需要澄清的是,GPU硬件并未专门更改以支持内核打印。在sm_20中,对GPU体系结构进行了修改,因此它可以支持适当的ABI,然后可以在其中实现所有标准的C ++功能,包括“ printf()”。具有sm_1x架构的GPU上没有ABI。 (3认同)