2013-12-09 9 views
3

В Kepler architecture whitepaper, NVIDIA утверждают, что существует 32 спецподразделений функции (SFUs) и 32 нагрузки/магазин единицы (LD/ST) на SMX.нагрузки/магазин Units (LD/ST) и спецподразделения функции (SFUs) для архитектуры Kepler

SFU предназначены для «быстрых приближенных трансцендентных операций». К сожалению, я не понимаю, что это значит. С другой стороны, в Special CUDA Double Precision trig functions for SFU говорится, что они работают только с одной точностью. Это все еще верно на K20Xm?

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

Приветствие, Andi

+0

Каким образом графические процессоры NVIDIA обрабатывают трансцендентные функции с двойной точностью? Это интересный вопрос, который я раньше не рассматривал. Надеюсь, кто-то может ответить. Если нет, я думаю, что мы можем сделать довольно хорошее предположение после измерения пропускной способности и количества действительных битов в результатах. –

+3

@RogerDahl SFUs работают только с одной точностью, как указано ниже. Их аппаратная реализация основана на квадратичной интерполяции в таблицах ROM с использованием арифметики с фиксированной точкой, как описано в статье _Stuart F. Oberman и Michael Siu. Высокопроизводительный многофункциональный многофункциональный интерполятор. В материалах 17-го симпозиума IEEE по компьютерной арифметике (Cap Cod, USA), стр. 272-279, июль 2005 г._ Это ответ, который njuffa дал мне некоторое время назад на форуме NVIDIA, см. [Специальные функции Fermi и Kepler GPU] (https://devtalk.nvidia.com/default/topic/531855/?comment=3746296). – JackOLantern

ответ

3

СФ предназначен для «быстрых приближенных трансцендентных операций»

SFUs вычислительных функции, как __cosf(), __expf() и т.д.

С другой стороны, здесь говорится, что они работают только в одинарная точность, это все еще правильно на K20Xm?

Согласно последним CUDA C Programming Guide, section G.5.1, они все еще работают только с одной точностью.

Это имеет смысл, поскольку, если вам нужна двойная точность, вряд ли вы будете использовать неточные математические функции. Вы можете обратиться к this answer за предложениями относительно арифметических оптимизаций с двойной точностью.

Детали реализации операций двойной точности можно найти в /usr/local/cuda-5.5/include/math_functions_dbl_ptx3.h (или там, где установлен ваш CUDA Toolkit). . для sin и cos он использует сокращение аргумента Payne-Hanek, за которым следует расширение Тейлора (до порядка 14).

Для двойных расчетов точности, SFUs, кажется, только в __internal_fast_rcp и __internal_fast_rsqrt, что, в свою очередь, используются в acos, log, cosh и несколько других функций (см math_functions_dbl_ptx3.h). Поэтому большую часть времени они останавливаются, например, блокировки LD/ST, если нет текущих транзакций памяти.

Следует ли загружать/записывать любую информацию из одного из тезисов?

Да, каждый доступ к глобальной памяти.

И используются ли они в качестве единственной основы? Другими словами, может быть только одна деформация, которая в настоящее время пишет или читает?

Число единиц ограничивает только количество инструкций, выданных за каждый цикл. То есть может быть выдан каждый 32-битный тактовый цикл, и 32 результата могут быть возвращены.

Одна инструкция может считывать/записывать до 128 байт, поэтому, если каждый поток в warp считывает 4 байта, и они объединены, то для полного преобразования требуется одна команда загрузки/хранения. Если доступ не развязан, тогда необходимо выдать больше инструкций.

Кроме того, единицы измерения - pipelined, что означает, что несколько запросов чтения/хранения могут выполняться одновременно одним блоком.

+0

Хорошо, спасибо, поэтому, если я правильно понял: когда у меня нет каких-либо одиночных трансцендентных операций, эти единицы просто останутся без дела? Есть ли другой способ, которым я могу их использовать? – user2267896

+2

SFU поддерживают только шесть операций (одиночная точность): sin/cos, exp/log, rcp/rsqrt. Они могут использоваться для трансценденталов, где одна команда точности дает хорошее приближение для уточнения (например, обратный, обратный квадратный корень). Но для трансценденталов, таких как синус и косинус, где одно приближение не помогает, вы не увидите никаких инструкций SFU в сгенерированном микрокоде. Реализация математической библиотеки с двойной точностью должна автоматически использовать SFU, где это принесет пользу. – ArchaeaSoftware

+0

@ArchaeaSoftware: Знаете ли вы, как реализованы трансценденталы DP и какой тип производительности и точности у них есть? –

1

Не принимайте это как ответ - мы надеемся, что кто-то придет и ответ на ваш вопрос о операциях двойной точности трансцендентных. Я просто хотел рассмотреть вторую часть вашего вопроса, о подразделениях LD/ST.

Блоки LD/ST, очевидно, предназначены для хранения и погрузки.

Да.

Следует ли загружать/записывать любую информацию из одного из тезисов?

Да.

И используются ли они в качестве единственной основы?

Да, все активные потоки в основе всегда выдают один и тот же тип инструкций в том же такте. Если эта инструкция является нагрузкой или хранилищем, она выдается на устройства LD/ST. Если поток неактивен (из-за циклического или условного выполнения), соответствующий модуль LT/ST остается бездействующим.

Иными словами, может быть только одна деформация, которая в настоящее время пишет или читает?

Нет, блоки LD/ST могут принимать одну нагрузку или хранить операцию за такт, даже если латентность памяти может составлять несколько сотен циклов. Итак, когда один warp выдает команду загрузки, единицы LD/ST начнут работать над извлечением этих данных. Инструкции в деформации, зависящие от данных, становятся непригодными для выдачи до тех пор, пока данные не поступят. В следующем такте цикл деформации может выполнять другие независимые инструкции (параллелизм на уровне инструкций). Даже другие, независимые инструкции по загрузке или хранению. Еще одна деформация, которая может быть запланирована, может также в следующем такте переключать другую команду загрузки и сама переходит в состояние ожидания (параллельность уровня нити). В этот момент блоки LD/ST отслеживают два ожидающих результата. Из-за кеширования и коалесценции возможно, что данные для второго варпа поступают первыми. Когда данные для варпа поступают, он присваивается регистрам, указанным в инструкции, и затем разрешается конкретная зависимость данных.

+0

Эй, спасибо, поэтому в принципе может быть выпущен только один набор из 32 операций загрузки/хранения, но может быть много людей в полете? (см. ответ aland). Другими словами: для оптимального использования нам нужно выпустить достаточные операции загрузки/хранения, чтобы они были заняты, не имея большой фактической пропускной способности (аппаратный лимит)? – user2267896