Запись в глобальную память в CUDA

Я хотел бы спросить об эффекте записи в глобальную память в CUDA. Известно, что чтение глобальной памяти часто сильно влияет на производительность (объединение, кэши, конфликты банков), так как может потребовать довольно много циклов ожидания поступающей памяти, что может в какой-то момент заблокировать выполнение.

А как насчет записи памяти в CUDA? Страдает ли он от какого-либо шаблона записи в память? Является ли общая стоимость непосредственно суммой всех операций записи в ядре?

Любые связанные ссылки и комментарии будут оценены.


person Zk1001    schedule 02.02.2012    source источник
comment
Это именно тот вопрос, который было бы интересно исследовать с помощью экспериментальной программы. Вы можете написать базовую программу OpenCL или CUDA, которая выполняет миллионы операций чтения и записи по различным шаблонам. Запускайте свои тесты снова и снова в цикле и смотрите, что вы получаете в среднем. Вероятно, это хороший способ изучить скучные части каждого API для загрузки.   -  person James    schedule 02.02.2012
comment
Спасибо, Джеймс, за комментарий!   -  person Zk1001    schedule 04.02.2012


Ответы (1)


В общем ответ на ваш вопрос "да", магазины похожи на грузы. Разница в том, что, поскольку хранилища являются «запущенными и забытыми», если есть работа, которая не зависит от сохраненных адресов, тогда она может быть немедленно запущена мультипроцессором (ами) после выдачи хранилищ, а зависание произойдет только тогда, когда встречаются зависимости чтения-после-записи.

Для получения полной информации я предлагаю прочитать раздел 5.3.2 последней версии Руководство по программированию CUDA.

Также см. приложение F к этому документу для получения конкретной информации, относящейся к различным семействам архитектур. Например, вычислительные возможности 1.x имеют больше «обрывов» производительности, чем вычислительные возможности 2.x (Fermi).

person harrism    schedule 03.02.2012
comment
Спасибо за ответ. Я понял, что большую часть этой теории можно подтвердить с помощью микробенчмаркинга. Однако мало что запуталось, когда на сцену вышел Ферми. Я заметил, что до Fermi были счетчики производительности для объединения памяти, но теперь их нет! Есть ли за этим какая-то причина? Я не думаю, что объединение памяти больше не имеет никакого эффекта в Fermi (как для чтения, так и для записи), но его концепция усложняется вкладом кешей. Итак, я думаю, именно поэтому NVIDIA удалила эти счетчики. Кто-нибудь знает об этом? - person Zk1001; 04.02.2012
comment
Да, это правильно. Счетчики были заменены счетчиками попаданий/промахов кэша. Последняя версия визуального профилировщика (4.1) значительно упрощает интерпретацию этих данных, создавая полезные метрики из счетчиков, а не показывая необработанные данные счетчиков. На Fermi все зависит от количества извлеченных строк кэша, а не от количества объединенных сегментов памяти. - person harrism; 06.02.2012