CUDA文件组织的高效方式:.cpp .h .cu .cuh .kernel文件

14

什么是CUDA最易于理解/高效等的代码组织方式?经过一些调查,我发现CUDA函数声明应放在.cuh文件中,实现应放在.cu文件中,核函数实现应放在.curnel文件中。其他C++内容通常在.cpp和.h文件中。最近我发布了一个问题visual studio .cu文件显示语法错误但编译成功。这种组织方式正确吗?其中.cpp调用.cu,而后者调用位于.curnel中的核函数。


5
“curnel”文件?我认为自己在CUDA方面经验还算丰富,并查看了很多其他人的项目,但我从来没有见过单独使用“curnel”作为文件扩展名。NVCC也肯定不理解它,也没有预定义的轨迹。 - talonmies
这取决于你,你可以按功能、按类型(.cu、.h、.cpp)或其他方式对文件进行分组,也可以将它们组合在一起(在功能组中,你可以将 .cu 文件放在一起)。 - Tomasz Dzięcielewski
2个回答

11
  • hcppchppinc - 不包含CUDA C代码(例如__device__和其他关键字、内核调用等)且不进行任何cuda运行时调用(cuda...函数)的文件。可以从这些文件中调用CUDA驱动程序API(cu...)函数。请注意,可以使用除NVCC之外的编译器编译这些文件。
  • cu - CUDA C源文件。这些文件传递给NVCC编译器以编译为可链接的(主机/设备)对象。
  • cuhcuinc - 包含在.cu文件中的文件。这些文件可能具有CUDA C关键字和/或调用CUDA运行时函数。

1
为什么驱动程序API可以被允许,但运行时不行?据我所知,运行时只是一组普通的C函数,我需要将它们链接起来。为什么调用它们的任何代码都需要通过特殊的编译步骤呢? - polwel

1
作为一个例子,假设有一个基于GPU的FDTD代码。我通常按照以下步骤进行(使用Visual Studio 2010)。
  • main.cpp文件,包括CPU-GPU内存传输;
  • FDTD.cu文件,包括一个extern "C" void E_update(...)函数,其中包含内核<<< >>>调用;
  • main.h文件,包括extern "C" void E_update(...)原型;
  • FDTD.cuh文件,包括__global__ void E_update_kernel(...)函数。

你能为那些空函数提供实现吗?谢谢! - Yola
什么是FDTD?它是你的项目名称还是CUDA中的其他内容?抱歉问一下,我对CUDA还不熟悉。 - bim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接