Cycles: Workaround dead-slow expf() on 64bit linux

Single precision exponent on 64bit linux tends to be order of magnitude slower
than double precision version even with single<->double precision conversion.

Some feedback in the mailing lists also suggests that logf() is also slow, but
this i didn't confirm here in the studio yet.

Depending on the shader setup it gives ~3% with the secret agent shot and up to
around 15% with the bmw scene here.
This commit is contained in:
Sergey Sharybin 2014-10-06 13:43:23 +06:00
parent 1f1dcdfd76
commit cd6129d1ff
2 changed files with 12 additions and 0 deletions

@ -17,6 +17,11 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
/* So ImathMath is included before our kernel_cpu_compat. */
#ifdef WITH_OSL
# include <OSL/oslexec.h>
#endif
#include "device.h" #include "device.h"
#include "device_intern.h" #include "device_intern.h"

@ -25,6 +25,13 @@
#include "util_half.h" #include "util_half.h"
#include "util_types.h" #include "util_types.h"
/* On 64bit linux single precision exponent is really slow comparing to the
* double precision version, even with float<->double conversion involved.
*/
#if !defined(__KERNEL_GPU__) && defined(__linux__) && defined(__x86_64__)
# define expf(x) ((float)exp((double)x))
#endif
CCL_NAMESPACE_BEGIN CCL_NAMESPACE_BEGIN
/* Assertions inside the kernel only work for the CPU device, so we wrap it in /* Assertions inside the kernel only work for the CPU device, so we wrap it in