0

该代码由 clCreateProgramWithSource 运行良好,由 clCreateProgramWithBinary 解除锁定。工作组的大小是(8,8),我在Intel Graphics win8.1+ HD4600/530和win10+HD630上重现了死锁。

local int SumAlpha[16*16/4];
int index = 1*get_local_id(0)+ 16/2*get_local_id(1);
......
SumAlpha[index] = sum_alpha;

barrier(CLK_LOCAL_MEM_FENCE);
// do reduction in shared mem
for(int i = (16*16/8); i > 0; i >>= 1) 
{
    if(index < i) 
    {
        SumAlpha[index] += SumAlpha[index + i]; 
    }
    barrier(CLK_LOCAL_MEM_FENCE); // unroll loop show deadlock when i==8
}

创建 spir 的 cmd 是

"..\vendors\OpenCL\Intel\bin\ioc32.exe -cmd=build -input="xxx" -device=gpu -spir32="FileName%" -bo="-cl-std=CL1.2 -I %ProjetcDir%\cl"

我试过'-cl-opt-disable',同样的死锁。我试过低于等价,也死锁了。

a = SumAlpha[index];
b = SumAlpha[index + i];
SumAlpha[index] = a+ b;

我可以使用指令点来避免减少,而我想知道更多。我错过了什么?或者有什么方法可以将两种方式的 gen 组装出来比较它们的差异?非常感谢。

4

0 回答 0