Произвольный доступ к памяти и конфликты банков

В эти дни я пробую программу на мобильном GPU (Adreno)

алгоритм, который я использую для обработки изображений, имеет "случайность" для доступа к памяти.

это относится к некоторым пикселям в "фиксированном" диапазоне для фильтрации.

НО, я не могу точно знать, какой пиксель будет передан (зависит от изображения)

насколько я понял. если многопотоковый доступ к локальному банку памяти вызывает конфликт банков. так что в моем случае это должно привести к банковскому конфликту.

МОЙ вопрос: Могу ли я устранить конфликт банков при произвольном доступе к памяти?

или я могу уменьшить их?

2 ответа

Решение

Предполагая, что расстояния между случайно выбранными пикселями как-то нормально распределены, можно подумать о разбиении изображения на подизображения.

Что я имею в виду: вместо того, чтобы работать с (скажем так) изображением 1024x1024, у вас могут быть изображения 4x4 размером 256x256. Каждый из них хранится вместе в памяти, поэтому "ближний" доступ к пикселям остается внутри одного и того же объекта изображения. Только операции на дальнем расстоянии должны иметь доступ к различным изображениям.

Второй вариант: вместо использования CLImage объекты, попробуйте сохранить ваши данные в массив. Данные в массиве могут быть сохранены в виде сортировки кривой Z-порядка. Это также приводит к уменьшению пространственного распределения (по сравнению с сортировкой по порядку строк)

Но, конечно, это сильно зависит от размера вашего изображения.

Существует множество способов справиться с конфликтами банков: размер элементов, с которыми вы работаете, шаг между линиями и смещение координат по разным адресам памяти. Тем не менее, он никогда не будет таким же хорошим, как неслучайный / бесконфликтный, и поэтому вы заметите, что это зависит от изображения - вы увидите значительно отличающиеся времена вычислений.

См. http://cuda-programming.blogspot.com/2013/02/bank-conflicts-in-shared-memory-in-cuda.html

Другие вопросы по тегам