我可以在.h文件中定义CUDA内核吗?

时间:2014-07-26 11:35:20

标签: cuda

我很难理解我应该如何处理CUDA程序中的不同文件:

我正在尝试重组我已经工作了一段时间的CUDA程序。到目前为止,它或多或少是一个文件程序。我有1个.cu文件,其中包含所有CUDA代码以及主要功能。我有几个包含的头文件,但它们只包含非CUDA函数。程序越来越大,越来越混乱,我想将内核构建成不同的文件以便于阅读。

最初我认为这样做的方法是拥有.cuh文件。我没有得到它的工作,所以我试图让我的头围绕this,这表明.h文件和.cu文件。但是,在其中包含其他.cu文件之后,该程序将不再构建。它通常要么不识别CUDA关键字,如als“__global__”,要么会在外部包含中引发错误,这似乎是无关的。

然而,我注意到,当我在.h文件中定义内核时,它会构建。我觉得这不是一个好主意,但不知道它的问题是什么。 困扰我的是,根据我的理解,.h文件甚至不应该由nvcc编译,那么它是如何工作的呢? 我很难理解最好的方法是什么。

我正在使用Visual Studio 2012和CUDA 5.5

1 个答案:

答案 0 :(得分:4)

这里的规则和行为在概念上与C或C ++编码中允许的规则和行为完全不同。

对于通过#include指令明确包含在另一个文件中的文件,文件名,实际上是文件扩展名 - .cu.h.cuh.hpp或者你有什么,真的无所谓。这只是编译器获取该文件的指令,并在源中插入它,就好像它已经在那里输入一样。

所以我无法让.cuh工作,但我能让.h工作真的没有用。编译器并不关心文件名。像.cuh.h这样的命名约定可以帮助我们组织大型代码库。

文件不会被编译,除非它们在源模块中或包含在源模块中(例如.cu.c.cpp等。)编译器不会编译。单独编译头文件(预编译头是另一个主题,与本讨论无关)。如果它们包含在源模块中,它只会编译它们。

在头文件中定义函数的危险在于,如果将头文件包含在多个源模块中,则将定义(即编译)多个源模块的函数。通常你不想要这个,因为它往往会导致多个定义错误。

如果您希望将头文件包含在一个且只有一个源模块中,那么将一些代码(即定义)放在该头文件中就没有问题。但是头文件的典型用法是声明,而不是定义

此讨论的__global__函数与任何其他C / C ++函数没有什么不同。如果将内核定义包含在多个源模块中,则将内核定义放在头文件中会冒多重定义错误的风险。如果你只将它包含在一个源模块中,那么如果你想做的话就没问题。