2014-11-11 2 views
1

В настоящее время я работаю с OpenCL и пытаюсь записать данные в массив, который будет использоваться из ЦП впоследствии. Размер локальной рабочей группы - «1», а размер рабочей группы - размер массива. Проблема заключается в следующем в kernel.cl:OpenCL Доступ к памяти

__kernel void foo (..., __global int *a){ 
int test_array[2]; 
for (int i = 0; i<20; i++){ 
    ... // do something here 
} 
test_array[0] = 5; 
int test = test_array[1]; 

a[gid] = test; // this throws an error at the graphical unit 
a[gid] = test_array[0] // but this works if we assign test_array after the for-loop 

В то время как происходит ошибка, экран становится черным для второго и возвращает ERRORCODE «-5» (CL_OUT_OF_RESSOURCES), но это, кажется, по умолчанию ErrorCode Nvidia ,

Чтение test_array (int test ..) показывает, что мы можем его прочитать, а [gid] = test_array [0] показывает, что мы можем получить доступ к массиву a [], но комбинация не выполняется ,

Так что мой вопрос:

  • Почему мы не можем копировать данные из test_array в виде [] - массив после для цикла?

Я ценю любые комментарии.

+0

'Почему мы не можем копировать данные из test_array в массив a [] после цикла for. 'Все, что вы делаете, это перемещение ошибки повреждения памяти при изменении исходного кода. Это не имеет никакого отношения к различию между входом int и int array. Поэтому проблема в том, что у вас где-то есть поврежденная память, и вам нужно выяснить, где. Поэтому мой совет для вас - убедиться, что ошибка все еще существует (не скрывайте ее, делая ненужные изменения в кодировке) и исправляйте проблему. – PaulMcKenzie

+0

Я не вижу причины, почему это не должно работать для вас. Неужели это происходит на другом gpus? Это может быть ошибкой в ​​реализации. Если у вас есть доступ к графике Intel HD или устройству AMD/ATI, было бы очень полезно попробовать его для отладки. Может быть, ошибка должна быть подана в Nvidia? Может быть, у вашего конкретного устройства есть проблема? – mfa

+0

Я согласен с @PaulMcKenzie. Или по-другому, это часть «сделать что-то здесь», которую вы оставили. Dithermaster

ответ

1

Эй Я Коллега Свена,

Мы нашли проблему. Это была проблема памяти, как мы думали, это была скорее семантическая ошибка.

Внутри цикла мы должны были использовать оператор if. Этот оператор if не будет оцениваться, как на CPU нам нужен один поток для каждой ветви if. Таким образом, нам пришлось изменить размер локальной рабочей группы от 1 до не менее 2. Чтобы все потоки выполнялись со случаем, что if является истинным и все с ложным утверждением. Неправильный будет выброшен.

Это приводит к ошибке на картах NVIDIA, но я не знаю почему. Мы также протестировали другую карту NVIDIA, которая также выдает -5 (CL_OUT_OF_RESSOURCES). Карточка AMD, которую мы использовали, работала, но была более медленной.

Так что спасибо за ваши комментарии с большим количеством намеков. Но решение заключалось в том, чтобы создать большую местную рабочую группу, чтобы заставить ее работать.

Смежные вопросы