Matrix OpenCL中矩阵行的约简

Matrix OpenCL中矩阵行的约简,matrix,sum,opencl,gpgpu,reduction,Matrix,Sum,Opencl,Gpgpu,Reduction,我有一个矩阵作为1D数组存储在GPU中,我正在尝试制作一个OpenCL内核,该内核将在该矩阵的每一行中使用约简,例如: 我们考虑矩阵是2x3的元素(1, 2, 3,4, 5, 6),我想做的是: [1, 2, 3] = [ 6] [4, 5, 6] [15] 显然,正如我所说的减少,实际回报可能是每行不止一个元素: [1, 2, 3] = [3, 3] [4, 5, 6] [9, 6] 然后我可以在另一个内核或CPU中进行最后的计算 到目前为止,我得到的是一个内核,它进行了缩减,但使

我有一个矩阵作为1D数组存储在GPU中,我正在尝试制作一个OpenCL内核,该内核将在该矩阵的每一行中使用约简,例如:

我们考虑矩阵是2x3的元素(1, 2, 3,4, 5, 6),我想做的是:

[1, 2, 3] = [ 6]
[4, 5, 6]   [15]
显然,正如我所说的减少,实际回报可能是每行不止一个元素:

[1, 2, 3] = [3, 3]
[4, 5, 6]   [9, 6]
然后我可以在另一个内核或CPU中进行最后的计算

到目前为止,我得到的是一个内核,它进行了缩减,但使用了数组的所有元素,如下所示:

[1, 2, 3] = [21]
[4, 5, 6]
执行此操作的实际缩减内核是(实际上,我从stackoverflow中获得):

\u内核无效
sum2(_全局浮点*inVector,_全局浮点*outVector,
常量unsigned int inVectorSize,u本地浮点*resultScratch)
{
const unsigned int localId=get_local_id(0);
const unsigned int workGroupSize=获取本地大小(0);
if(获取全局id(0)>1;a>0;a>>=1)
{
屏障(CLK_本地_MEM_围栏);
如果(a>localId)
resultScratch[localId]+=resultScratch[localId+a];
}
if(localId==0)
outVector[get_group_id(0)]=resultScratch[0];
屏障(CLK_本地_MEM_围栏);
}

我想一个解决方案是修改精简内核,这样它就可以对数组的部分进行精简

\u内核无效
sum2(_全局浮点*inVector,
__全局浮点*输出向量,
无符号整数inVectorOffset,
无符号整数inVectorSize,
__本地浮点*resultScratch)
{
const unsigned int localId=get_local_id(0);
const unsigned int workGroupSize=获取本地大小(0);
if(获取全局id(0)>1;a>0;a>>=1)
{
屏障(CLK_本地_MEM_围栏);
如果(a>localId)
resultScratch[localId]+=resultScratch[localId+a];
}
if(localId==0)
outVector[get_group_id(0)]=resultScratch[0];
屏障(CLK_本地_MEM_围栏);
}

然后,您可以对矩阵的一行进行缩减,提供行开头的inVectorOffset和行中元素的inVectorSize数量。

如果您向我们提供问题,我们将更容易回答。但是,我猜您想知道如何将此示例扩展到2D/a矩阵。您可以先并行地对每一行进行缩减,然后对最后一列进行缩减。