Странное поведение частной памяти в OpenCL - PullRequest
0 голосов
/ 20 сентября 2018

Этот код прерывается, когда размер частного объекта превышает 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,

Кроме того, если я изменяю размер на <= 32 (128 байт), это всегда работает.printf глючит в OpenCL OS X, но даже без printf меняет неправильные значения. </p>

У меня есть все последние версии на Mac Pro с двумя картами AMD D700.Если я загружаюсь в Windows и запускаю ее там, она работает отлично.

Я скажу, что это ошибка компилятора OpenCL, но я не уверен, и я не знаю, как обойти это.

1 Ответ

0 голосов
/ 20 сентября 2018

Поскольку Тим Рэндалл предложил инициализировать с пустым состоянием, а затем установить элементы вручную, это решит проблему.

Итак:

State state;
for (int i = 0; i < SZ; i++)
   state.arr[i]=i;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...