Как можно быстрее получить доступ к глобальному массиву только для чтения с помощью CUDA? - PullRequest
4 голосов
/ 05 ноября 2011

У меня есть огромный массив, который должен читаться разными потоками параллельно. Каждый поток должен читать разные записи в разных местах во всем массиве, от начала до конца. Буфер доступен только для чтения, поэтому я не думаю, что требуется «критическая секция».

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

Есть идеи?

Редактировать: Некоторые из вас спрашивали меня, почему мне нужен доступ к различным частям массива, поэтому вот несколько объяснений: я пытаюсь реализовать "алгоритм аукциона" . В одном ядре каждый поток (человек) должен делать ставки на предмет, цена которого зависит от его интереса к этому предмету. Каждый поток должен проверить свой интерес к данному объекту в большом массиве, но это не проблема, и я могу объединить чтение в разделяемой памяти. Проблема в том, что, когда поток выбрал ставку за элемент, он должен сначала проверить его цену, и, поскольку есть много объектов, на которые нужно сделать ставку, я не могу перенести всю эту информацию в общую память. Более того, каждый поток должен иметь доступ ко всему буферу цен, поскольку он может делать ставки на любой объект. Единственное мое преимущество в том, что буфер доступен только для чтения.

Ответы [ 2 ]

2 голосов
/ 05 ноября 2011

Самый быстрый способ доступа к глобальной памяти - это объединенный доступ, однако в вашем случае это может оказаться невозможным.Вы можете исследовать текстурную память, которая доступна только для чтения, хотя обычно используется для пространственного 2D-доступа.

Раздел 3.2 Руководства по оптимальной практике Cuda содержит большую информацию об этом и других методах памяти.*

1 голос
/ 05 ноября 2011

Чтение из общей памяти намного быстрее по сравнению с чтением из глобальной памяти. Может быть, вы можете загрузить подмножество массива в общую память, которая требуется потокам в блоке. Если потокам в блоке требуются значения из совершенно разных частей массива, вы должны изменить свой алгоритм, так как это приведет к медленному доступу без использования ресурсов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...