fmad = false dá bom desempenho
De notas de lançamento da 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.
Eu tenho dois kernels - um é puramente computado com muitas multiplicações, enquanto o outro é ligado à memória. Percebo uma melhoria consistente no desempenho (cerca de 5%) para o meu kernel com uso intensivo de computação quando faço-fmad=false
... e aproximadamente o mesmo percentual de declínio no desempenho quando eu desligo para o meu kernel ligado à memória. Então, o FMA está funcionando melhor para o meu kernel ligado à memória, mas o kernel ligado ao meu computador pode extrair um pouco do desempenho desativando-o. Qual seria a razão? Meu dispositivo é M2090 e estou usando o CUDA 4.2.
Opções completas de compilação:-arch,sm_20,-ftz=true,-prec-div=false,-prec-sqrt=false,-use_fast_math,-fmad=false
(ou eu simplesmente removofmad=false
porque esse é o padrão de qualquer maneira.