编写一个CUDA内核来替换一个等效的cpu函数

Writing a CUDA kernel to replace an equivalent CPU-only function

本文关键字:一个 函数 cpu CUDA 内核 替换      更新时间:2023-10-16

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

这些粒子技术中最耗时的组件之一是在模拟的每个时间步为每个粒子找到最近的邻居(k近邻或范围搜索)。

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

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

那么我应该重命名所有我以前的.cpp文件作为.cu文件和重新编译整个集合(连同nsearch.cu)使用nvcc ?至少对于简单的例子,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。使用"nvcc -c -o nsearch"编译它。O",然后链接搜索。O带主应用。必须有一个search.h文件,导出实际内核周围的包装器。

in nsearch.h : 
void kern();
in nsearch.cu:
void __global__ kern__() {
}
void kern() {
  kern__<<<...>>>();
}

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