我想创建一个适用于 AMD GPU (Fury Nano) 的 OpenCL 内核。基本上我想使用 OpenCL 编写一个内核草案,并使用 OpenCL API 使用 clGetProgramInfo 输出汇编代码。然后我将修改汇编代码并使用 clcreateprogramwithbinary 将其加载回程序。
有没有可能的方法来做到这一点?
如果你添加“--save-temps”来调用创建程序(或任何它被调用的)你会看到生成的程序集文件。您可以修改这些,然后可以从该程序集创建一个 opencl 程序。
另一种获取程序集输出的方法是构建支持 amd gpu 的 llvm,然后使用 -S 标志将其编译为程序集。
我用 opencl 标准 2.0 用于 Polaris10 的命令行是:
clang -std=CL2.0 -target amdgcn-amd-amdpal-opencl -mcpu=polaris10 -S -c foo.cl -O3
您需要修改 foo.cl 以包含 opencl-ch,方法是添加
#include <opencl-c.h>
到 opencl 源文件的第一行。
这将在当前目录中生成作为 foo.s 的程序集文件。要为 R9 fury 生成代码,请将 mcpu 更改为 fiji。IE。
... -mcpu=fiji ...
我可以建议使用CLRadeonExtender,这是一个真正的 AMD GCN GPU 汇编器,支持 Windows 和 Linux 上的所有主要 OpenCL 运行时。我有一个非常积极的经验。