Конфликт банка OpenCL - потеря памяти / повреждение данных?
Заранее извиняюсь за неопределенность этого вопроса.
Фон:
Я пытаюсь написать морфологическую функцию обработки изображений в OpenCL. У меня есть __local буфер, который я использую для хранения данных для каждого пикселя (каждый пиксель представлен рабочим элементом, пока не развернут цикл). Кроме того, так как я начинаю тестировать, я использую только одну рабочую группу (изображение 8x8 пикселей, поэтому я могу вручную проверить результаты).
Проблема:
Есть случаи, когда данные из одного, двух, трех или даже четырех пикселей должны быть добавлены в буфер пикселей другого. Так как это смежные пиксели в одной рабочей группе, я уверен, что я вызываю локальные конфликты банка памяти. Это нормально, скорость не мой главный приоритет (пока!). Однако эти банковские конфликты, похоже, сбрасывают данные и даже портят данные. Я был очень осторожен, чтобы не переполнить и не переполнить буферы.
Итак, мой первый вопрос: возможно ли, что конфликты банков приводят к повреждению и потере данных? Спецификация Opencl, кажется, указывает на то, что операция должна сериализоваться, замедляя пропускную способность, но нет никаких упоминаний о потере данных.
Мой второй вопрос: помогите! - Что я могу с этим поделать?
Любое руководство будет с благодарностью - спасибо!
1 ответ
Может быть, при помощи префикса nvidia whitepaper (Scan) с помощью 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, но я обнаружил, что полученные ядра очень похожи, так как обе технологии используют схожие концепции.
Надеюсь, статья поможет вам.
ура