Kernel 通用OpenCL模具内核和主机

Kernel 通用OpenCL模具内核和主机,kernel,opencl,generic-programming,memory-access,stencils,Kernel,Opencl,Generic Programming,Memory Access,Stencils,我是OpenCL的新手 我想编写一个通用内核,以便以后我可以将其应用扩展到其他内存非合并模式,并将其与矩形模具模式搭配使用,以简化操作(同时避免越界访问) 这个内核控制本地内存的使用(\uuuu local float)∗lmem) 到目前为止,我的.cl文件结构如下: __kernel void kmain ( __global float ∗in , __global float ∗out , __global float ∗in2 , __local flo

我是OpenCL的新手

我想编写一个通用内核,以便以后我可以将其应用扩展到其他内存非合并模式,并将其与
矩形模具模式搭配使用,以简化操作(同时避免越界访问)

这个内核控制本地内存的使用(
\uuuu local float)∗lmem

到目前为止,我的
.cl
文件结构如下:

__kernel void kmain (
    __global float ∗in ,
    __global float ∗out ,
    __global float ∗in2 ,
    __local float ∗lmem)
{
    int wg_x = get group id(0);
    int wg_y = get group id(1);
    int wi_x = get local id(0);
    int wi_y = get local id(1);     

    // number of work units each work-item processes
    for (int iter_x = 0; iter_x< NUM_WUS_X-1, iter_x++ ) {
        for (int iter_y = 0; iter_y< NUM_WUS_Y-1; iter_x++) {
            int wu_x, wu_y;

            // The current work unit coordinate (wu_x, wu_y) is computed based on work group ID (wg_x, wg_y), work item ID (wi_x, wi_y) and work unit ID (iter_x, iter_y) :
            (wu_x, wu_y) = func(wg_x, wg_y
                          wi_x, wi_y,
                          iter_x ,iter_y);

        // This is where to cooperatively load
        // a region of <in> to the local memory.
        // barrier (...);

            for (int i = 0; i < N-1, i++) {
                for (int j = 0; j< M-1, j++) {

                // (fo, fi) detemines the home access pattern centered around (idx_o, idx_i). WI(*,*) defines the memory access pattern i.e: (wi_x) = (wi_y) :
                int idx_o = fo(wu_x, wu_y, i, j);
                int idx_i = fi(wu_x, wu_y, i, j);

                // offsets CO's and CI's  determine stencil pattern within each work-item
                ... = in[idx_o + CO_1][idx_i + CI_1];
                ... // context (inner loop body)
                ... = in[idx_o + CO_k][idx_i + CI_k];
                ... // context (inner loop body)
            }
        }
        // barrier (...);
        ... // context (epilogue)
        out[y][x] = ...;
        }
    }
}
\u内核无效(
__全球浮动∗在里面
__全球浮动∗出来
__全球浮动∗in2,
__局部浮动∗(伦敦金属交易所)
{
int wg_x=获取组id(0);
int wg_y=获取组id(1);
int wi_x=获取本地id(0);
int wi_y=获取本地id(1);
//每个工作项处理的工作单元数
对于(int-iter\ux=0;iter\ux

有人知道如何用相应的通用主机实现此模式吗?

您可以在OpenCL绑定上开发主机端封装,以便

  • 它从用户那里获取一些通用代码字符串
  • 它在运行时使用用户字符串生成内核,这也取决于您选择的重新塑造内核的“策略”
  • 内核字符串还定义了一个名为“scratch\u pad”的自定义资源
    • 具有可选择的内存类型(本地/全局/寄存器/常量)
    • 由必要的输入自动填充
    • 由用户限制最大尺寸
    • 它有许多
      []
      操作符的实现,用于不同内存类型和数据模式的不同访问模式
  • 自动将相关主机端缓冲区绑定到内核端缓冲区
然后,您可以简单地更改参数列表中的一个标志,根据本地和全局内存性能对其进行测试,或者为其指定不同的内核字符串,但这并不比简单地编写不同的cl文件容易。如果您只有几个不同的实现,看起来工作量太大了。当您不知道结果内核字符串时,调试也会变得更加困难


很抱歉迟了回复。

您的意思是想让
func()
fo()
fi()
随着策略模式的不同使用情况的调整而改变吗?@huseyin,是的,这些以及模具模式(矩形)形成一个通用模板,让我使用本地内存而不是不使用它