2017-08-27 141 views
0

我想我的C++只项目CUDA代码在GPU上运行的转换。cuda - nvcc如何编译__host__代码?

我是新来的CUDA编程,我不知道如何处理这种情况下做的:

如果我有一个非常复杂的类定义,现在我想一个类实例传递给设备并执行它的一些成员函数在设备上,然后我应该重写我的整个.cpp文件。我是否只需要将设备上运行的这些功能转换为__host__ __device__或者是否应该重写所有功能?

我认为没有功能类型限定为__host__nvcc治疗功能。它如何编译主机代码?它是否完全按照g++进行编译?

回答

1

如果我有一个非常复杂的类定义,现在我想将 类实例传递给设备,并执行一些的设备上它的成员函数 ,我则应该重写我的整个.cpp文件。难道我只 需要打开设备运行这些功能__host__ __device__或 我应该重写所有的功能?

这完全取决于你的代码。 CUDA支持C++语言功能的有限子集(完整文档here),并且几乎不支持C++标准库。所以没有一般​​的答案,但如果你想在GPU上调用它,很可能你将不得不重写至少一些你的类成员函数代码。

我认为nvcc把没有函数类型限定符的函数视为__host__。它如何编译主机代码?它是否像g ++一样编译它们?

首先要明白的是,NVCC不是一个编译器,它是一个编译器驱动程序。没有.cu文件扩展名的文件中的纯C++代码默认情况下直接通过一组预定义的编译器选项直接传递给主编译器,而不需要修改。一个.CU扩展文件内

主机代码由CUDA C++前端解析以寻找CUDA语法,然后传递到主机编译器。这个过程可能会在极其复杂的模板定义和流血的语言功能上失败。 nvcc还自动包含CUDA头文件,这些头文件可能会与您自己的代码的内容发生冲突。但是,最终你的主机代码会到达主机C++编译器,尽管是通过不同的路线。