【问题标题】:Strange private memory behaviour in OpenCLOpenCL 中奇怪的私有内存行为
【发布时间】:2019-02-24 22:20:00
【问题描述】:

当私有对象的大小超过 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, 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、

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、

此外,如果我将大小更改为

我在配备双 D700 AMD 卡的 Mac Pro 上拥有所有最新版本。如果我启动到 Windows 并在那里运行它,它会完美运行。

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

【问题讨论】:

  • 您的意思是state.arr[1]=111; 吗?写的我看不懂代码
  • 如下初始化state会不会出现同样的问题? for (int i = 0; i &lt; SZ; i++) state.arr[i]=i;由于我无法在这里重现问题,我只能尝试将部分代码规则输入或输出
  • 是的 =111。我的错。
  • 谢谢蒂姆!这样就彻底解决了。如果我按照您建议的方式初始化,我可以有任何尺寸!你知道为什么吗?不幸的是,我不是 C 大师。顺便说一句,我发现它对其他卡/操作系统也有问题,但有一个例外,不像在 AMD/OS X 上那样默默无闻。
  • 我不知道出了什么问题。也许那个特定的编译器有大型初始化程序的问题。我不断地计算和重新计算列表,希望找到超过 33 个成员,但它看起来仍然合法。而你得到的“错误”输出......看起来像state 现在指的是完全不同的内存区域,这意味着堆栈损坏.code。

标签: c operating-system gpu opencl


【解决方案1】:

正如 Tim Randall 建议的那样,使用空状态进行初始化,然后手动设置成员可以解决问题。

所以:

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

【讨论】:

  • 一旦您的问题得到解决,您应该将答案(这个)标记为已接受,以便从列表中显示为已解决
猜你喜欢
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多