我的问题从这里开始: 1。我的项目可以有超过1个.CU文件吗? 2。 CU文件可以删除类吗?
class foo
{
int m_name;
void doSomething();
}
3。这个继续2.我认为DEVICE内核不能在类中声明,必须这样做:
//header file
__DEVICE__ void kernel(int x, inty)
{.....
}
class a : foo
{
void doSomething();
}
//cu file
void a::doSomething()
{
kernel<<<1,1>>>......();
}
这是正确的方法吗? 4.last问题是,我们使用THRUST,我也必须使用CU文件吗?
谢谢,igal
答案 0 :(得分:2)
.cu
文件。编译器的前端根据C ++语法规则处理CUDA源文件。主机代码支持完整的C ++。但是,如附录D中所述,设备代码仅完全支持C ++的一个子集。由于使用了C ++语法规则,因此无法将void指针(例如,由malloc()返回)分配给非void指针。没有类型转换。
你几乎是正确的。在声明内核时,您必须使用__global__
关键字。
__global__ void kernel(int x, inty)
{.....
}
nvcc
编译。有关详细信息,请参阅thrust
文档。通常,您将编译您的程序:
$ nvcc -c device.cu
$ g++ -c host.cpp -I/usr/local/cuda/include/
$ nvcc device.o host.o
或者,您可以使用g ++执行最终链接步骤。
$ g++ tester device.o host.o -L/usr/local/cuda/lib64 -lcudart
在Windows上更改-I
和-L
之后的路径。另外,据我所知,你必须使用cl
编译器(MS Visual Studio)。
注1:
注意x86 / x64兼容性:如果使用64位CUDA Toolkit,也可以使用64位编译器。 (还要检查-m32
的{{1}}和-m64
选项)
注2:
nvcc
包含内核和调用内核的函数。此函数必须使用device.cu
进行注释。
它可以包含类(限制适用)。
extern "C"
包含host.cpp
(非内核)中函数的extern "C"
声明的纯C ++代码。