fmad=false дает хорошую производительность

Из примечаний к выпуску Nvidia:

 The nvcc compiler switch, --fmad (short name: -fmad), to control the contraction of    
 floating-point multiplies and add/subtracts into floating-point multiply-add   
 operations (FMAD, FFMA, or DFMA) has been added: 
 --fmad=true and --fmad=false enables and disables the contraction respectively. 
 This switch is supported only when the --gpu-architecture option is set with     
 compute_20, sm_20, or higher. For other architecture classes, the contraction is     
  always enabled. 
 The --use_fast_math option implies --fmad=true, and enables the contraction.

У меня есть два ядра: одно связано исключительно с вычислениями с большим количеством умножений, а другое связано с памятью. Я замечаю постоянное улучшение производительности (около 5%) для моего ядра с интенсивными вычислениями, когда я выполняю -fmad=false... и примерно такое же процентное снижение производительности, когда я отключаю его для своего ядра с привязкой к памяти. Таким образом, FMA работает лучше для моего ядра, привязанного к памяти, но мое ядро, привязанное к вычислениям, может немного снизить производительность, отключив его. Что может быть причиной? Мое устройство M2090, и я использую CUDA 4.2.

Полные параметры компиляции: -arch,sm_20,-ftz=true,-prec-div=false,-prec-sqrt=false,-use_fast_math,-fmad=false (или я просто удаляю fmad=false, потому что это все равно по умолчанию.


person Sayan    schedule 17.08.2012    source источник
comment
Использование FMA может немного увеличить нагрузку на регистры, поскольку одновременно должны быть доступны три исходных операнда. Таким образом, включение/выключение генерации FMA может привести к небольшим различиям в планировании инструкций и распределении регистров, что, в свою очередь, может привести к небольшим различиям в производительности. Для ядра, привязанного к вычислениям, со многими идиомами умножения и сложения, -fmad=true должно существенно повлиять на производительность, но, как вы говорите, в вашем ядре преобладают умножения, и поэтому использование FMA мало выиграет, и любой выигрыш может быть компенсируется давлением регистра / аспектами планирования инструкций.   -  person njuffa    schedule 18.08.2012
comment
отлично, большое спасибо за подтверждение   -  person Sayan    schedule 20.08.2012
comment
@njuffa, не могли бы вы опубликовать свой комментарий в качестве ответа?   -  person harrism    schedule 31.08.2012


Ответы (1)


Использование FMA может немного увеличить нагрузку на регистры, поскольку одновременно должны быть доступны три исходных операнда. Таким образом, включение/выключение генерации FMA может привести к небольшим различиям в планировании инструкций и распределении регистров, что, в свою очередь, может привести к небольшим различиям в производительности. Для ядра, привязанного к вычислениям, со многими идиомами умножения и сложения, -fmad=true должно существенно повлиять на производительность, но, как вы говорите, в вашем ядре преобладают умножения, и поэтому использование FMA мало выиграет, и любой выигрыш может быть смещение по аспектам давления регистра / планирования команд

person njuffa    schedule 31.08.2012