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

Why do I need to include <stdio.h> to use CUDA's printf()?

我想 printf() 我的 CUDA 内核中的一些东西。编程指南 suggests 我是这样做的:

#include <stdio.h>

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

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

这是一个你不需要知道的实现细节,它源于 CUDA 语法的限制(基本上,定义同一函数的不同 __device____host__ 版本是非法的) .

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