使用 Meson 构建 CUDA 内核

Posted

技术标签:

【中文标题】使用 Meson 构建 CUDA 内核【英文标题】:Build CUDA kernel with Meson 【发布时间】:2020-09-15 06:50:45 【问题描述】:

我正在尝试构建一个使用 Cuda 内核的应用程序。为此,我正在使用meson build system,但没有成功。基本上我想做的是以下几点:

//main.cpp

extern void kernel_function();

int main(int argc, char *argv[])

  // some logic here...

  kernel_function();
  return 0;

//kernel.cu

__global__ void kernel()
  // some code here...


void kernel_function()

  dim3 threads( 2, 1 );
  dim3 blocks( 1, 1 );

  kernel<<< blocks, threads >>>();

我可以用以下命令编译上面的代码:

g++ -c main.cpp
nvcc -c kernel.cu
nvcc -o main main.o kernel.o

如何复制我在终端上使用 Meson 执行的编译过程?

【问题讨论】:

那么错误是什么? 【参考方案1】:

在最简单的情况下,它可能是这样的:

project('cuda dependency', 'cpp', 'cuda')
executable('main', 'main.cpp', 'kernel.cu')

然后运行

$ CXX=g++ meson build
$ ninja -C build

(基于example)。

但你可能需要添加依赖项,例如

dep = dependency('cuda', version : '>=10', modules : ['cublas'])
executable(..., dependencies: dep)

或借助 cuda 模块设置一些特殊的编译器标志,检查介子上的this reference。

【讨论】:

对我不起作用,我收到以下错误消息:“在制作 PIE 对象时无法使用针对 `.rodata' 的重定位 R_X86_64_32;使用 -fPIE 重新编译”。 @Alexander 如果你用 b_pie 配置项目会怎样,即 $ meson --reconfigure -Db_pie=true 使用“-Db_pie=true”选项我有以下内容:“错误:语言 Cuda 不支持与位置无关的可执行文件”。 还有一件事:命令“nvcc -o myexe myfile.cpp -lmylib”有效,其中“mylib”是用介子构建的。此外,介子可以从单个源文件构建 cuda 可执行文件:executable('main', 'kernel.cu') - 有效!如果我有两个以上的文件,什么不起作用。看起来“PIE”选项只需要传递给主编译器(我使用 gcc),而不需要传递给 nvcc。 有了这个配置:“meson configure -Dcpp_args=-fPIE”我能够编译。现在介子抱怨对“cublasCreate_v2”的未定义引用。看起来 cublas 库没有与可执行文件链接。

以上是关于使用 Meson 构建 CUDA 内核的主要内容,如果未能解决你的问题,请参考以下文章

使用 Meson 在 Windows 上构建和运行 GTK 应用程序

Meson 和 NInja 构建系统:指定二进制文件的存储位置

Meson与Ninja

Linux From Scratch(LFS11.0)构建 LFS 系统 - Meson-0.59.1

Linux上Meson安装及使用

为 Meson Build 运行特定测试