OpenCL嵌套内核

时间:2016-09-16 05:18:57

标签: c kernel opencl reduce pyopencl

我有一个nxnxm ndarray,我想减少m轴。 pyopencl有一个内置的ReductionKernel,如下所示:

class pyopencl.reduction.ReductionKernel(ctx, dtype_out, neutral, reduce_expr, map_expr=None, arguments=None, name="reduce_kernel", options=[], preamble="")

如果按以下方式编写,它会成功将单个向量与标量相加:

krnl = ReductionKernel(context, numpy.float32, neutral="0",reduce_expr="a+b", map_expr="x[i]", arguments="__global float *x")
sum_A = krnl(d_A).get()

其中sum_A是浮点数,d_A是设备存储器上的向量。

我想调用这个内核并为nxn矩阵中的每个索引传递一个m长度的列。我的策略是将整个nxnxm ndarray传递给父内核,然后使用enqueue_kernel将数组传递给ReductionKernel,但我不确定语法在接收总和方面是如何工作的。顺便说一下,矩阵已经按行顺序排列,因此m长度数组已经是连续的。

__kernel reduce(global float* input, 
                global float* output,
                const unsigned int m, 
                const unsigned int n)
{
    const int i = get_global_id(0);
    const int j = get_global_id(1);

    float array[m];

    //Initialize an array of input[i*m+j*m*n] to input[i*m+j*m*n + m]
    for(k = 0, k < m, k++)
    {
        array[k] = input[i*m+j*m*n+k];
    }

    //enqueue ReductionKernel with this array
    //Place result in output[i*n+j]
}

0 个答案:

没有答案