我有一个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]
}