C++ 编写CUDA内核以替换等效的纯CPU函数

C++ 编写CUDA内核以替换等效的纯CPU函数,c++,gcc,cuda,nvcc,C++,Gcc,Cuda,Nvcc,我有一些.cpp文件,它们实现了平滑粒子流体动力学,这是一种用于模拟流体流动的粒子方法 这些粒子技术中最耗时的部分之一是在模拟的每个时间步为每个粒子寻找最近邻(K-最近邻或范围搜索) 现在我只想用GPU和CUDA加速邻居搜索程序,取代我目前基于CPU的邻居搜索程序。只有邻居搜索将在GPU上运行,而其余的模拟将在CPU上进行 我的问题是,我应该如何编译整个代码?更具体地说,假设我在文件nsearch.cu中编写邻居搜索内核函数 然后,我是否应该将以前的.cpp文件重命名为.cu文件,并使用nvcc

我有一些
.cpp
文件,它们实现了平滑粒子流体动力学,这是一种用于模拟流体流动的粒子方法

这些粒子技术中最耗时的部分之一是在模拟的每个时间步为每个粒子寻找最近邻(K-最近邻或范围搜索)

现在我只想用GPU和CUDA加速邻居搜索程序,取代我目前基于CPU的邻居搜索程序。只有邻居搜索将在GPU上运行,而其余的模拟将在CPU上进行

我的问题是,我应该如何编译整个代码?更具体地说,假设我在文件
nsearch.cu
中编写邻居搜索内核函数

然后,我是否应该将以前的
.cpp
文件重命名为
.cu
文件,并使用
nvcc
重新编译整个文件集(以及nsearch.cu)?至少对于简单的示例,nvcc无法编译扩展名为
.cpp
的CUDA代码,即
nvcc foo.cu
编译,但
nvcc hello.cpp
不编译

简而言之,这个CUDA插件的结构应该是什么?我应该如何编译它


我正在使用Ubuntu Linux 10.10、CUDA 4.0、NVIDIA GTX 570(Compute capability 2.0)和gcc编译器进行我的工作

您需要编写nsearch.cu文件,并使用“nvcc-c-o nsearch.o”进行编译,然后将nsearch.o链接到主应用程序。必须有一个nsearch.h文件来导出实际内核的包装器

in nsearch.h : 
void kern();

in nsearch.cu:
void __global__ kern__() {
}
void kern() {
  kern__<<<...>>>();
}
nsearch.h中的
:
void-kern();
在nsearch.cu中:
void _全局_; kern __;(){
}
void kern(){
克恩;
}

这是对你问题的更广泛的回答,因为我经历了一个与你非常相似的思考过程——将我的流体动力学代码移到GPU上,而将其他所有东西都留在CPU上。虽然我认为这是您应该开始的地方,但我也认为您应该开始计划将所有其他代码移到GPU上。我发现,虽然GPU非常擅长进行我的模拟所需的矩阵分解,但GPU和CPU内存之间的内存边界非常缓慢,大约80-90%的GPU模拟时间都花在cudaMemcpyDeviceToHost/cudaMemcpyHostToDevice上