Конфликт банка OpenCL - сбрасывание памяти/повреждение данных?

Заранее извиняюсь за неконкретность этого вопроса.

Задний план:

Я пытаюсь написать функцию обработки морфологических изображений в OpenCL. У меня есть буфер __local, который я использую для хранения данных для каждого пикселя (каждый пиксель представлен рабочим элементом, цикл еще не разворачивается). Кроме того, поскольку я нахожусь на ранней стадии тестирования, я использую только одну рабочую группу (изображение 8x8 пикселей, поэтому я могу вручную проверять результаты).

Проблема:

Бывают случаи, когда данные одного, двух, трех или даже четырех пикселей необходимо добавить в буфер пикселей другого. Поскольку это соседние пиксели в одной и той же рабочей группе, я уверен, что вызываю конфликты локальных банков памяти. Это нормально, скорость не является моим главным приоритетом (пока!). Однако эти конфликты банков, похоже, приводят к потере данных и даже повреждению данных. Я был очень осторожен, чтобы не переполниться и не переполнить буферы.

Итак, мой первый вопрос: возможно ли, что конфликты банков вызывают повреждение и потерю данных? Спецификация Opencl, кажется, указывает, что операция должна быть сериализована, что замедляет пропускную способность, но нет упоминания о потере данных.

Второй вопрос: Помогите! - Что я могу сделать по этому поводу?

Любое руководство будет принято с благодарностью - спасибо!


person Reefpoints    schedule 17.02.2011    source источник
comment
Просто чтобы вы знали, что у меня такая же проблема с картой NVIDIA... Кажется, что реализация общей памяти очень привередлива к проблемам синхронизации, и компилятор, по-видимому, не может их обойти. Мне также пришлось удалить ветвь в цикле и развернуть цикл, чтобы все вычислялось правильно. И в любом случае это стало быстрее без ветки и некоторых дополнительных фиктивных вычислений;)   -  person Samuel Audet    schedule 25.11.2011
comment
Можете ли вы поделиться кодом? Как выполняются добавления? Используете ли вы атомные операции там, где это необходимо. Вы синхронизируете доступ к памяти с барьерами? Сомнительно, что конфликты банков могут привести к повреждению данных. Это больше похоже на неподходящие шаблоны доступа к памяти. Но мы можем только догадываться без кода.   -  person Tim Child    schedule 20.08.2014


Ответы (1)


возможно, технический документ nvidia Сумма префиксов (сканирование) с CUDA может привести вас на правильный путь. Речь идет о all-prefix-sums algorithm, который is a good example of a computation that seems inherently sequential, but for which there is an efficient parallel algorithm.

all-prefix-sums operation превращает списки чисел [3,4,1,2] в их суммы: [0,3,7,8].

Я знаю, что статья посвящена CUDA, но я обнаружил, что полученные ядра очень похожи, поскольку обе технологии используют схожие концепции.

Надеюсь, газета вам поможет.

Ваше здоровье

person Framester    schedule 05.05.2011