массив OpenCL возвращает 0

#opencl #gpu

#opencl #графический процессор

Вопрос:

Я относительно новичок в OpenCL и у меня проблема с доступом к массиву. Я использую printf для отладки программы.

(По общему признанию, надуманный) код выглядит следующим образом:

 __constant static int array_2[4] = {
    0, 1,
    2, 3
};

void __kernel first_kernel(__global const int* input, __global int* output) {
    __private int array_0[2];
    __private int array_1[] {
        100, 101, 102, 103
    };
    for (int index < 0; index < 2; index  ) {
        array_0[0] = array_1[array_2[2 * index]];
        array_0[1] = array_1[array_2[2 * index   1]];
        printf("array_0: [%d, %d]n", array_0[0], array_0[1]);
        printf("array_1[0] = %dn", array_1[0]);
        printf("array_2[2 * index] = %dn", array_2[2 * index]);
        printf("array_1[array_2[2 * index]] = %dn", array_1[array_2[2 * index]]);
    }
}
  

Результат для первой итерации равен:

array_0: [0, 0]

array_1[0] = 100

array_2[2 * index] = 0

array_1[array_2[2 * index]] = 0

Почему вывод последней строки «0»? Кажется, что доступ к массиву с использованием константы 0 дает правильный результат, но доступ к тому же массиву с использованием «array_2[2 * index], который равен 0, дает неверный результат. Что происходит?

Спасибо за помощь!

Комментарии:

1. Для контекста: «массив 2» здесь означает таблицу поиска значений. «массив 1» — это массив, который будет отличаться для каждого рабочего элемента в зависимости от ввода и положения рабочего элемента. «массив 0» — это промежуточный массив, используемый для определения выходных данных, изменяемый на каждой итерации цикла for.

2. Строка for (int index < 0; index < 2; index ) { содержит синтаксическую ошибку. Вы уверены, что на самом деле используете этот код, и опубликованный вами код действительно страдает от этой проблемы, или вы нечетко переводите из какого-то другого кода, который неправильно себя ведет из-за какой-то другой ошибки, не связанной с опубликованным вами кодом? __private int array_1[] { 100, 101, 102, 103 }; также содержит синтаксическую ошибку, поэтому мне интересно, не изолировали ли вы на самом деле свою проблему, потому что не протестировали свой минимальный образец.)

3. Я предполагаю, что у вас неопределенное поведение в другом месте вашего кода, влияющее на этот код.

4. Спасибо за ответ, @pmdj. Я попытаюсь найти способ опубликовать мой фактический код, что может оказаться невозможным из-за академических ограничений!

5. Нет ничего плохого в сокращении вашего кода до размера вопроса о переполнении стека, фактически, это обычно рекомендуется. Однако в этом случае, я думаю, вы исправили ошибку. Я подозреваю, что вы могли бы обнаружить, где ошибка, если вы сокращаете свой код шаг за шагом и продолжаете тестирование на каждом шаге. Вы можете обнаружить, что удаление, казалось бы, несвязанного кода внезапно приводит к исчезновению ошибки. По крайней мере, это поможет вам точно определить код, который действительно вызывает проблему.