Multithreading 如何使用intel\u sub\u group\u block\u read分配读取的数据<;n>;在OpenCL中,在列主顺序的子组中跨工作项?

Multithreading 如何使用intel\u sub\u group\u block\u read分配读取的数据<;n>;在OpenCL中,在列主顺序的子组中跨工作项?,multithreading,opencl,opencl-c,Multithreading,Opencl,Opencl C,我的矢量化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

我的矢量化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
}
int8io;
uint8区块1、区块2;
int2 coordA;
coordA=int2(0,0);
block1=英特尔子集团block read8(组织,合作组织);
坐标x+=4;
block2=英特尔子集团block read8(组织,合作组织);
对于(int i=0;i<8;i++)
{
iO.lo=转换为int4(如图4((uint*)(&block1))[i]);
iO.hi=转换为int4(如uchar4((uint*)(&block2))[i]);
//在这里做计算
}

在这里,我正在读取两个块,每个块有8行,类型为
uint
。在对
uchar
进行类型转换时,我得到2个8x4数据块,这实际上是一个8x8的
uchar
类型数据块。但上述方法的问题是,它将创建数据按行主顺序排列的工作项。因此,如果我尝试进行类似于
m[0]=x0+x4
的计算,这是不可能的,因为
x0
x4
将位于不同的工作项中。因此,我唯一能想到的另一种方法是将数据按列主顺序存储在工作项中。因此,我将使用垂直线程,而不是水平线程。但是我不知道怎么做。

你能把元素
intel\u subgroup\u shuffle*
洗牌到正确的通道(“线程”)吗?我想我不完全理解
intel\u subgroup\u shuffle
。据我所知,shuffle将相同的数据复制到所有线程。所以为了使用shuffle,在我的例子中,我必须进行标量加载而不是向量加载,对吗?但是它比向量运算更有效吗?我自己不是SGs方面的专家,但我相信子组id不必是统一的。也就是说,你可以旋转一个向量值<代码>\u随机(数据,(id+k)%subgroup\u size)。请参阅[能否将元素
intel\u subgroup\u shuffle*
无序排列到正确的通道(“线程”)?我想我还没有完全理解
英特尔子组\u shuffle
。据我所知,shuffle将相同的数据复制到所有线程。因此,为了使用shuffle,在我的情况下,我必须执行标量加载而不是向量加载,对吗?但它比向量操作更有效吗?我自己不是SGs方面的专家,但我相信子组组id不必是统一的。也就是说,您可以旋转向量值。
\u shuffle(data,(id+k)%subgroup\u size)
。请参阅[