Как я понимаю в CUDA нет возможности для глобальной синхронизации, только внутри блока потоков. Однако CUDA-GDB может остановить все потоки во время исполнения а потом возобновить, значит помимо мульти процессоров в архитектуре видеокарты должна быть еще какая-то составная часть отвечающая за управление исполнением всех мультипроцессоров?
Дак вот я и думаю почему разработчикам не дали прямой возможности для использования глобальных барьеров?
Есть идеи почему в CUDA отсутствует поддержка глобальной барьерной синхронизации?
By moron - July 26th, 2009
Tagged:
Comments
нет управления глобальной синхронизацией, потому что они посчитали, что раз не возникает конфликтов обращения, то этим можно управлять автоматически и давать такую возможность разработчику ни к чему. А зачем Вам управлять этим? И разве ядра не станут в очередь на исполнение, что замедлит процесс, если на них разбить алгоритм?
Ну вообще lexa ответил в полне почему сейчас невозможно глобальная синхронизация.
>А зачем Вам управлять этим?
:-) ответ на этот вропрос есть в любой книге по параллельным вычислениям(например Эндрюс Г.Р. основы многопоточного, параллельного и распределенного программирования. глава 3 Блокировки и барьеры).
Ядро может иметь следующие инструкции для опираций над матрицей
И1;
И2;
каждая из них может изменяет матрицу, прочем не так что 1 поток в обоих инструкциях производит операцию над одной ячейкой мартици, а каждый поток в И1 может читать и менять соседа слева, а И2 читать и меняет соседа справа. Таким образом внутри инструкции И1 и И2 по отдедльности конфликтов обращения не будет. Однако если часть потоков завершит И1 и пристуит к И2 возникнут проблемы. В таком случае идельно было бы проставть браьер бежду И1 и И2 в классическом многопоточном программировании. Я решил проблем следующим образом: разделил И1 и И2 в разные ядра(kernals).
ПС я занимаюсь расчет временного поля по заранее известной скоросной 3Д модели (для сейсморазведки).
Блокировки по глобальной памяти (атомарная запись) - в CUDA есть, это пожалуйста. Требуется Compute capability 1.1 или выше т.е. на исходной G80 не работает, на более поздних - работает (даже на 8600M работает т.е. добавили почти сразу).
Они не очень эффективны (судя по тому, что в ферми их на полпорядка-порядок обещали ускорить), но есть.
Ну в моем случае атомарная запись не могла решить всех проблем. Так например в И2 должны производится операции только когда в матрице обновленны все значения посчитанные в И1.
Там будут проблемы, связанные с тем, что содержимое регистров и локальной памяти нужно куда-то девать, а потом оттуда доставать (представьте себе ситуацию, когда у вас много блоков и все блоки задачи одновременно в мультипроцессоры не помещаются)
Глобальная синхронизация и "остановка того, что сейчас работает" - это разные вещи.
Благодарю за ответ.
Как я понимаю написание собственых барьеров с активным ожидание ставит ограничение на число блоков потоков.
Буду тогда разбивать алгоритм на керналы :-). Вроде как издержка на запуск ядра, не считая прересылки данных, 90 микросекунд.