是",;“循环展开”;在OpenCL中是隐式的还是显式的?

是",;“循环展开”;在OpenCL中是隐式的还是显式的?,opencl,Opencl,我曾尝试在OpenCl代码中添加#pragma unroll和#pragma unroll,但没有看到延迟方面的任何改进。循环中的语句是独立的,应该并行运行。所以,我想知道OpenCL是否隐式展开循环,添加展开pragma不会有帮助 我的部分代码是这样的 for(j = 0; j < 4; j++) { m[0][j] = p0[j] + p0[j+4]; m[0][j+4] = p0[j] - p0[j+4]; m[1][j] = p1[j] + p1[j

我曾尝试在OpenCl代码中添加
#pragma unroll
#pragma unroll
,但没有看到延迟方面的任何改进。循环中的语句是独立的,应该并行运行。所以,我想知道OpenCL是否隐式展开循环,添加展开pragma不会有帮助

我的部分代码是这样的

for(j = 0; j < 4; j++)
{
    m[0][j]   = p0[j] + p0[j+4];
    m[0][j+4] = p0[j] - p0[j+4];
    m[1][j]   = p1[j] + p1[j+4];
    m[1][j+4] = p1[j] - p1[j+4];
    m[2][j]   = p2[j] + p2[j+4];
    m[2][j+4] = p2[j] - p2[j+4];
    m[3][j]   = p3[j] + p3[j+4];
    m[3][j+4] = p3[j] - p3[j+4];
}
m[0][0]   = p0[0] + p0[0+4];
m[0][0+4] = p0[0] - p0[0+4];
m[1][0]   = p1[0] + p1[0+4];
m[1][0+4] = p1[0] - p1[0+4];
m[2][0]   = p2[0] + p2[0+4];
m[2][0+4] = p2[0] - p2[0+4];
m[3][0]   = p3[0] + p3[0+4];
m[3][0+4] = p3[0] - p3[0+4];

m[0][1]   = p0[1] + p0[1+4];
m[0][1+4] = p0[1] - p0[1+4];
m[1][1]   = p1[1] + p1[1+4];
m[1][1+4] = p1[1] - p1[1+4];
m[2][1]   = p2[1] + p2[1+4];
m[2][1+4] = p2[1] - p2[1+4];
m[3][1]   = p3[1] + p3[1+4];
m[3][1+4] = p3[1] - p3[1+4];

m[0][2]   = p0[2] + p0[2+4];
m[0][2+4] = p0[2] - p0[2+4];
m[1][2]   = p1[2] + p1[2+4];
m[1][2+4] = p1[2] - p1[2+4];
m[2][2]   = p2[2] + p2[2+4];
m[2][2+4] = p2[2] - p2[2+4];
m[3][2]   = p3[2] + p3[2+4];
m[3][2+4] = p3[2] - p3[2+4];

m[0][3]   = p0[3] + p0[3+4];
m[0][3+4] = p0[3] - p0[3+4];
m[1][3]   = p1[3] + p1[3+4];
m[1][3+4] = p1[3] - p1[3+4];
m[2][3]   = p2[3] + p2[3+4];
m[2][3+4] = p2[3] - p2[3+4];
m[3][3]   = p3[3] + p3[3+4];
m[3][3+4] = p3[3] - p3[3+4];

编译器可能正在展开,但不会重新排序指令以获得最佳性能

也许这与指令级并行性或填充管道无关

也许是关于内存访问模式

为了防止编译器无法执行或指令重新排序,以下是示例:

m[0][0]   = p0[0] + p0[0+4];  <---- contiguous   addr = x
m[0][0+4] = p0[0] - p0[0+4];
m[1][0]   = p1[0] + p1[0+4];
m[1][0+4] = p1[0] - p1[0+4];
m[2][0]   = p2[0] + p2[0+4];
m[2][0+4] = p2[0] - p2[0+4];
m[3][0]   = p3[0] + p3[0+4];
m[3][0+4] = p3[0] - p3[0+4];

m[0][1]   = p0[1] + p0[1+4];  <---- contiguous   addr = x+1
m[0][1+4] = p0[1] - p0[1+4];
m[1][1]   = p1[1] + p1[1+4];
m[1][1+4] = p1[1] - p1[1+4];
m[2][1]   = p2[1] + p2[1+4];
m[2][1+4] = p2[1] - p2[1+4];
m[3][1]   = p3[1] + p3[1+4];
m[3][1+4] = p3[1] - p3[1+4];

m[0][2]   = p0[2] + p0[2+4];  <---- contiguous   addr = x+2
m[0][2+4] = p0[2] - p0[2+4];
m[1][2]   = p1[2] + p1[2+4];
m[1][2+4] = p1[2] - p1[2+4];
m[2][2]   = p2[2] + p2[2+4];
m[2][2+4] = p2[2] - p2[2+4];
m[3][2]   = p3[2] + p3[2+4];
m[3][2+4] = p3[2] - p3[2+4];

m[0][3]   = p0[3] + p0[3+4];  <---- contiguous   addr = x+3
m[0][3+4] = p0[3] - p0[3+4];
m[1][3]   = p1[3] + p1[3+4];
m[1][3+4] = p1[3] - p1[3+4];
m[2][3]   = p2[3] + p2[3+4];
m[2][3+4] = p2[3] - p2[3+4];
m[3][3]   = p3[3] + p3[3+4];
m[3][3+4] = p3[3] - p3[3+4];

并以类似的方式重新排列其余数组,因此对于所有数组,mem访问都会更好。但我不确定m数组,因为它可能是行主数组,也可能是列主数组,具体取决于设备。

您是否尝试了uuu属性uuu((opencl_unroll_hint(n))?刚才试过了,没用。你试过手动展开吗?没有,我没有试过。那么,如果你展开循环会怎么样?
m[0][0]   = p0[0] + p0[0+4];
m[0][1]   = p0[1] + p0[1+4]; 
m[0][2]   = p0[2] + p0[2+4];
m[0][3]   = p0[3] + p0[3+4];
...