我的带有矢量化的 OpenCL 代码是这样的
short8 x0, x1, x2, x3, x4, x5, x6, x7, m[8];
x0 = convert_short8(vload8(0, Org + 0 * Stride));
x1 = convert_short8(vload8(0, Org + 1 * Stride));
x2 = convert_short8(vload8(0, Org + 2 * Stride));
x3 = convert_short8(vload8(0, Org + 3 * Stride));
x4 = convert_short8(vload8(0, Org + 4 * Stride));
x5 = convert_short8(vload8(0, Org + 5 * Stride));
x6 = convert_short8(vload8(0, Org + 6 * Stride));
x7 = convert_short8(vload8(0, Org + 7 * Stride));
m[0] = x0 + x4;
m[1] = x1 + x5;
m[2] = x2 + x6;
m[3] = x3 + x7;
m[4] = x0 - x4;
m[5] = x1 - x5;
m[6] = x2 - x6;
m[7] = x3 - x7;
现在我正在尝试使用带有块读取的英特尔 OpenCL 子组扩展来重写上述逻辑。
int8 iO;
uint8 block1,block2;
int2 coordA;
coordA = int2(0,0);
block1 = intel_sub_group_block_read8(Org, coordA);
coordA.x += 4;
block2 = intel_sub_group_block_read8(Org, coordA);
for (int i = 0 ; i < 8; i++)
{
iO.lo = convert_int4(as_uchar4(((uint*)(&block1))[i]));
iO.hi = convert_int4(as_uchar4(((uint*)(&block2))[i]));
// Do computations here
}
在这里,我正在阅读 2 块,每块 8 行,类型为uint
. 在进行类型转换时,uchar
我得到 2 个 8x4 数据块,这实际上是一个 8x8uchar
类型数据块。但上述方法的问题在于,它将创建具有行主要顺序的数据的工作项。因此,如果我尝试进行类似的计算m[0] = x0 + x4
,则不可能x0
并且x4
将在不同的工作项中。所以我能想到的唯一另一种方法是在工作项中按列主要顺序存储数据。因此,我将使用垂直线程而不是水平线程。但我不知道该怎么做。