【发布时间】:2021-04-03 19:12:07
【问题描述】:
我有一些与 python 接口的 OpenCL 内核抛出了 pyopencl 库。内核用于加速交换操作(如加法或乘法),其中操作输入变量的顺序无关紧要。进行加法的内核可能如下所示:
__kernel void addition(__global const float *a_g,
__global const float *b_g,
__global float *res_g)
{
int gid = get_global_id(0);
res_g[gid] = a_g[gid] + b_g[gid];
}
为简单起见,假设所有操作缓冲区(a_g、b_g、res_g)具有相同的大小和一维。全局工作大小设置为启动内核之前的缓冲区大小,结果存储在res_g 缓冲区中。
这些操作以顺序方式工作,一个内核的输出用作下一个内核的输入。鉴于所有这些内核看起来都像上面的代码 sn-p,我可以通过编写以下内核来简单地将 4 个输入“链接”在一起:
__kernel void addition_chained(__global const float *a_g,
__global const float *b_g,
__global const float *c_g,
__global const float *d_g,
__global float *res_g)
{
int gid = get_global_id(0);
res_g[gid] = a_g[gid] + b_g[gid] + c_g[gid] + d_g[gid];
}
这样,不需要分配中间结果缓冲区,启动新线程也没有开销。
这是常见的优化吗?这样做有什么好处和坏处?
在 OpenCL 中是否有任何规范的方式来链接内核?在编译时可能不知道需要链接的操作数量。
【问题讨论】:
-
附带说明:我不确定链接是否是正确的术语