使用汇编代码创建 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 运行时。我对此有非常积极的体验。
我想创建一个在 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 运行时。我对此有非常积极的体验。