OpenCL中奇怪的私有内存行为

时间:2018-09-20 14:51:19

标签: c operating-system gpu opencl

当私有对象的大小超过128个字节时,此代码将中断。它仅在OS X上发生。有人知道发生了什么事吗?

#define SZ 33 // Always works with 32 and below

typedef struct S
{
    int arr[SZ];
} State;

__kernel void myKernel()
{
    printf("sizeof State: %d\n", sizeof(State));
    printf("Threat ID: %d\n", get_local_id(0));

    State state = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}};

    for (int i = 0; i < SZ; i++)
        printf("%d, ", state.arr[i]);

    printf("\n");

    // uncomment this and it bugs with garbage output.
//  state.arr[1] = 111;

    for (int i = 0; i < SZ; i++)
        printf("%d, ", state.arr[i]);
}

预期输出为:

  

0、1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、0、1、2、3、4   5,6,7,8,9,10,11,12,13,14,15,16,
  0、1、2、3、4、5、6、7、8   9,10,11,12,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10,11,12,   13、14、15、16,

但是,如果我取消注释该行,输出将变成这样:

  

8782104、8782104、256、256、256、256、256、256、256、256、256、256、256,   256、256、256、256、256、256、256、256、256、256、256、256、256、256、256,   256、256、256、256、256、256、256,

     

8782104、111、256、256、256,   256、256、256、256、256、256、256、256、256、256、256、256、256、256、256,   256、256、256、256、256、256、256、256、256、256、256、256、256、256、256,

此外,如果我将大小更改为<= 32(128字节),它将始终有效。 在OpenCL OS X上,printf有很多错误,但是即使没有printf,它也会更改错误的值。

我拥有配备双D700 AMD卡的Mac Pro的所有最新信息。如果我启动进入Windows并在其中运行,它会完美运行。

我会说这是一个OpenCL编译器错误,但是我不确定,我也不知道如何解决它。

1 个答案:

答案 0 :(得分:0)

蒂姆·兰德尔(Tim Randall)建议使用空状态进行初始化,然后手动设置成员即可解决此问题。

所以:

State state;
for (int i = 0; i < SZ; i++)
   state.arr[i]=i;