cuda - nvcc如何编译__host__代码?

时间:2017-08-27 07:09:25

标签: c++ cuda

我试图将我的c ++项目转换为cuda代码,以便在GPU上运行。

我是cuda编程的新手,我不知道如何处理这种情况:

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

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

1 个答案:

答案 0 :(得分:1)

  

如果我有一个非常复杂的类定义,现在我想传递一个   类实例到设备并执行它的一些成员函数   在设备上,我应该重写我的整个.cpp文件。我只是   需要将设备上运行的这些功能转为myListBox1.Invoke((Action)(() => { myListBox1.Items.Add(txt) })); 或   我应该重写所有的功能吗?

这完全取决于您的代码。 CUDA支持有限的C ++语言特性子集(完整记录here),几乎不支持C ++标准库。所以没有一般​​的答案,但是如果你想在GPU上调用它们,你可能必须至少重写一些类成员函数代码。

  

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

首先要理解的是,nvcc不是编译器,而是编译器驱动程序。默认情况下,没有.cu文件扩展名的文件中的普通C ++代码会直接传递给主编译器,并带有一组预定义的编译器选项而无需修改。

.cu扩展文件中的主机代码由CUDA C ++前端解析,以查找CUDA语法,然后传递给主机编译器。对于极其复杂的模板定义和前沿语言功能,此过程可能会失败。 nvcc还会自动包含CUDA标头,这些标头可能会与您自己代码的内容冲突。但最终您的主机代码到达主机C ++编译器,尽管路径不同。