Может ли 1 ядро ​​CUDA обрабатывать более 1 инструкции с плавающей запятой за такт (Максвелл)?

Список графических процессоров Nvidia - GeForce 900 Series - там написано, что:

4 Производительность одинарной точности рассчитывается как 2-кратное число шейдеров, умноженное на базовую тактовую частоту ядра.

Т.е. например для GeForce GTX 970 мы можем рассчитать производительность:

1664 ядер * 1050 МГц * 2 = 3 494 пиковых флопов (3 494 400 мфлопс)

Это значение мы видим в столбце - Мощность обработки (пиковая) GFLOPS - Single Precision.

Но почему мы должны умножить на 2?

Там написано: http://devblogs.nvidia.com/parallelforall/maxwell-most-advanced-cuda-gpu-ever-made/

SMM использует конструкцию на основе квадрантов с четырьмя 32-ядерными блоками обработки, каждый с выделенным планировщиком деформации, способным отправлять две инструкции за такт.

Хорошо, nVidia Maxwell - это суперскалярная архитектура, которая отправляет две инструкции за такт, но может ли 1 ядро ​​CUDA (FP32-ALU) обрабатывать более 1 инструкции за такт?

Мы знаем, что 1 ядро ​​CUDA содержит два блока: блок FP32 и блок INT. Но INT-модуль не имеет отношения к GFlops (операций сплавающей точкой в секунду).

Т.е. один СММ содержит:

  • 128 FP32-блок
  • 128 INT-блок
  • 32 SFU-единицы
  • 32 LD/ST-блок

Для получения префоманса в GFlops нам нужно использовать только: 128 FP32-блоков и 32 SFU-блока.

Т.е. если мы одновременно используем как 128 модулей FP32, так и 32 модуля SFU, то мы можем получить 160 инструкций с операциями с плавающей запятой за такт на 1 СМ.

Т.е. мы должны умножить на 1,2 = (160/132) вместо 2.

1664 ядер * 1050 МГц * 1,2 = 2096 пиков GFlops

Зачем писать в вики, что мы должны умножить число ядер * МГц на 2?

введите описание изображения здесь

введите описание изображения здесь

1 ответ

Решение

"Ядро" CUDA (также называемое SP) чаще всего относится к единицам с плавающей запятой одинарной точности в SM (потоковом мультипроцессоре). Ядро CUDA может инициировать одну инструкцию с плавающей запятой одинарной точности за такт. (Устройство конвейерно, поэтому оно может инициировать одну инструкцию за такт и может удалить одну инструкцию за такт, но не может полностью обработать данную инструкцию в данном такте.)

Если эта команда, например, представляет собой сложение с одинарной точностью или умножение с одинарной точностью, то это ядро ​​может вносить одну операцию с плавающей запятой за такт, поскольку сложение или умножение считается одной операцией с плавающей запятой. Если, с другой стороны, инструкция является инструкцией FMA (умножение-сложение с плавающей запятой), то ядро ​​выполнит операцию умножения с плавающей запятой и операцию сложения с плавающей запятой за один и тот же период времени. Это означает, что фактически две операции выполняются одной инструкцией. Такое использование FMA дает множитель 2 при вычислении максимальной теоретической пропускной способности.

Таким образом, ядро ​​может обрабатывать (то есть инициировать, удалять) только одну инструкцию за такт, но если эта инструкция является FMA, она считается двумя операциями с плавающей запятой.

Другие вопросы по тегам