使用汇编代码创建 AMD OpenCL 内核

Create AMD OpenCL kernel using Assembly code

我想创建一个在 AMD GPU (Fury Nano) 上运行的 OpenCL 内核。 基本上我想使用 OpenCL 编写内核草案,并使用 OpenCL API 使用 clGetProgramInfo 输出汇编代码。然后我将修改汇编代码并使用clcreateprogramwithbinary将其加载回程序。

有什么可行的方法吗?

如果您将“–save-temps”添加到创建程序(或任何它所调用的)的调用中,您将看到生成的程序集文件。您可以修改这些,然后可以从该程序集创建一个 opencl 程序。

获取程序集输出的另一种方法是构建支持 amd gpu 的 llvm,然后使用 -S 标志将其编译为程序集。

我用于 polaris10 的命令行,opencl 标准 2.0 是:

clang -std=CL2.0 -target amdgcn-amd-amdpal-opencl -mcpu=polaris10 -S -c foo.cl -O3

您需要修改 foo.cl 以包含 opencl-c.h,方法是添加

#include <opencl-c.h>

到opencl源文件的第一行。

这将在当前目录中生成 foo.s 的程序集文件。要为 R9 fury 生成代码,请将 mcpu 更改为 fiji。即

... -mcpu=fiji ...

我建议使用 CLRadeonExtender,它是 AMD GCN GPU 的真正汇编程序,支持 Windows 和 Linux 上的所有主要 OpenCL 运行时。我对此有非常积极的体验。