Произвольный доступ к памяти и конфликты банков
В эти дни я пробую программу на мобильном GPU (Adreno)
алгоритм, который я использую для обработки изображений, имеет "случайность" для доступа к памяти.
это относится к некоторым пикселям в "фиксированном" диапазоне для фильтрации.
НО, я не могу точно знать, какой пиксель будет передан (зависит от изображения)
насколько я понял. если многопотоковый доступ к локальному банку памяти вызывает конфликт банков. так что в моем случае это должно привести к банковскому конфликту.
МОЙ вопрос: Могу ли я устранить конфликт банков при произвольном доступе к памяти?
или я могу уменьшить их?
2 ответа
Предполагая, что расстояния между случайно выбранными пикселями как-то нормально распределены, можно подумать о разбиении изображения на подизображения.
Что я имею в виду: вместо того, чтобы работать с (скажем так) изображением 1024x1024, у вас могут быть изображения 4x4 размером 256x256. Каждый из них хранится вместе в памяти, поэтому "ближний" доступ к пикселям остается внутри одного и того же объекта изображения. Только операции на дальнем расстоянии должны иметь доступ к различным изображениям.
Второй вариант: вместо использования CLImage
объекты, попробуйте сохранить ваши данные в массив. Данные в массиве могут быть сохранены в виде сортировки кривой Z-порядка. Это также приводит к уменьшению пространственного распределения (по сравнению с сортировкой по порядку строк)
Но, конечно, это сильно зависит от размера вашего изображения.
Существует множество способов справиться с конфликтами банков: размер элементов, с которыми вы работаете, шаг между линиями и смещение координат по разным адресам памяти. Тем не менее, он никогда не будет таким же хорошим, как неслучайный / бесконфликтный, и поэтому вы заметите, что это зависит от изображения - вы увидите значительно отличающиеся времена вычислений.
См. http://cuda-programming.blogspot.com/2013/02/bank-conflicts-in-shared-memory-in-cuda.html