Блоки загрузки / хранения (LD/ST) и блоки специальных функций (SFU) для архитектуры Kepler
В техническом описании архитектуры Kepler NVIDIA утверждает, что 32
Специальные функциональные блоки (SFU) и 32
Загрузите / Сохраните Единицы (LD/ST) на SMX.
SFU предназначены для "быстрых приближенных трансцендентных операций". К сожалению, я не понимаю, что это должно означать. С другой стороны, в специальных триггерных функциях CUDA Double Precision для SFU говорится, что они работают только с одинарной точностью. Это все еще правильно на K20Xm?
Устройства LD / ST предназначены для хранения и загрузки. Требуется ли загрузка / запись памяти для выполнения одного из тезисов? И они также используются в качестве единой основы? Другими словами, может ли быть только один перекос, который в настоящее время пишет или читает?
Ура, Энди
2 ответа
СФУ предназначены для "быстрых приближенных трансцендентных операций"
SFU вычисляют такие функции, как __cosf()
, __expf()
и т.п.
С другой стороны, здесь сказано, что они работают только с одинарной точностью, верно ли это для K20Xm?
Согласно недавнему Руководству по программированию CUDA C, раздел G.5.1, они все еще работают только с одинарной точностью.
Это имеет некоторый смысл, поскольку, если вам нужна двойная точность, маловероятно, что вы использовали бы неточные математические функции. Вы можете обратиться к этому ответу за предложениями по арифметической оптимизации двойной точности.
Детали реализации операций двойной точности можно найти в /usr/local/cuda-5.5/include/math_functions_dbl_ptx3.h
(или везде, где установлен ваш CUDA Toolkit). Например, для sin
а также cos
он использует сокращение аргумента Пейна-Ханека с последующим расширением Тейлора (до порядка 14).
Для расчетов с двойной точностью SFU, кажется, используются только в __internal_fast_rcp
а также __internal_fast_rsqrt
которые в свою очередь используются в acos
, log
, cosh
и несколько других функций (см. math_functions_dbl_ptx3.h
). Так что большую часть времени они останавливаются, как блоки LD/ST, если нет текущих транзакций памяти.
Требуется ли загрузка / запись памяти для прохождения одного из тезисов?
Да, каждый доступ к глобальной памяти.
И они также используются в качестве единой основы? Другими словами, может ли быть только один перекос, который в настоящее время пишет или читает?
Количество единиц ограничивает только количество инструкций, выдаваемых в каждом цикле. Т.е. в каждом тактовом цикле может быть выдано 32 инструкции чтения, и 32 результата могут быть возвращены.
Одна инструкция может считывать / записывать до 128 байтов, поэтому, если каждый поток в деформации читает 4 байта и они объединяются, тогда для всего деформирования потребуется одна инструкция загрузки / сохранения. Если доступ не коалесцирован, то должно быть выдано больше инструкций.
Кроме того, модули передаются по конвейеру, что означает, что несколько запросов на чтение / сохранение могут выполняться одновременно одним модулем.
Не принимайте это как ответ - мы надеемся, что кто-нибудь придет и ответит на ваш вопрос о трансцендентных операциях двойной точности. Я просто хотел затронуть вторую часть вашего вопроса о блоках LD/ST.
Устройства LD/ST предназначены для хранения и загрузки.
Да.
Требуется ли загрузка / запись памяти для прохождения одного из тезисов?
Да.
И они также используются в качестве единой основы?
Да, все активные потоки в деформации всегда выдают одинаковые инструкции в одном и том же тактовом цикле. Если эта инструкция является загрузкой или хранилищем, она передается единицам LD/ST. Если поток неактивен (из-за циклического или условного выполнения), соответствующий модуль LT/ST остается бездействующим.
Другими словами, может ли быть только один перекос, который в настоящее время пишет или читает?
Нет, блоки LD/ST могут принимать одну операцию загрузки или сохранения за такт, хотя задержка памяти может составлять несколько сотен циклов. Таким образом, когда одна деформация выдает команду загрузки, модули LD/ST начнут работать над получением этих данных. Инструкции в основе, которые зависят от данных, становятся недопустимыми до тех пор, пока данные не поступят. В следующем тактовом цикле деформация все еще может выполнять другие независимые инструкции (параллелизм на уровне команд). Даже другие, независимые инструкции загрузки или хранения. Другая деформация, которая может быть запланирована, может также в следующем цикле синхронизации выпустить другую инструкцию загрузки и сама перейти в состояние ожидания (параллелизм на уровне потока). В этот момент устройства LD/ST отслеживают два ожидающих результата. Из-за кэширования и объединения возможно, что данные для второй деформации поступают первыми. Когда поступают данные для деформации, они присваиваются регистрам, указанным в инструкции, и эта конкретная зависимость данных затем разрешается.