#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. Нет ничего плохого в сокращении вашего кода до размера вопроса о переполнении стека, фактически, это обычно рекомендуется. Однако в этом случае, я думаю, вы исправили ошибку. Я подозреваю, что вы могли бы обнаружить, где ошибка, если вы сокращаете свой код шаг за шагом и продолжаете тестирование на каждом шаге. Вы можете обнаружить, что удаление, казалось бы, несвязанного кода внезапно приводит к исчезновению ошибки. По крайней мере, это поможет вам точно определить код, который действительно вызывает проблему.