diff options
| author | Tor Aamodt <[email protected]> | 2010-10-01 08:55:28 -0800 |
|---|---|---|
| committer | Tor Aamodt <[email protected]> | 2010-10-01 08:55:28 -0800 |
| commit | 11b308e7363e937966b035b4891db32b4eece3bf (patch) | |
| tree | 50ca4c9ad6f163ac4acb2bf505e64dfebed66947 /src/cuda-sim/cuda-math.h | |
| parent | bb820c116764d7a1b8e071137d32b74e7f34dd2f (diff) | |
integrating recent changes from fermi-test into fermi
(i'll use "fermi" for more disruptive changes to the pipeline model such
as updating the MSHRs and getting rid of the warp tracker, ripping out DWF, etc...)
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 7805]
Diffstat (limited to 'src/cuda-sim/cuda-math.h')
| -rw-r--r-- | src/cuda-sim/cuda-math.h | 234 |
1 files changed, 231 insertions, 3 deletions
diff --git a/src/cuda-sim/cuda-math.h b/src/cuda-sim/cuda-math.h index 5abf4f3..367563f 100644 --- a/src/cuda-sim/cuda-math.h +++ b/src/cuda-sim/cuda-math.h @@ -47,6 +47,7 @@ namespace cuda_math { #define __attribute__(a) // to remove warnings inside math_functions.h #undef INT_MAX +#if CUDART_VERSION < 3000 // DEVICE_BUILTIN struct int4 { int x, y, z, w; @@ -70,18 +71,245 @@ namespace cuda_math { extern float rsqrtf(float); // CUDA 2.3 beta -#if CUDART_VERSION < 3000 #define CUDA_FLOAT_MATH_FUNCTIONS #include <device_types.h> #define __CUDA_INTERNAL_COMPILATION__ #include <math_functions.h> #undef __CUDA_INTERNAL_COMPILATION__ #undef __attribute__ + +// float to integer conversion +int float2int(float a, enum cudaRoundMode mode) +{ + return __internal_float2uint(a, mode); +} + +// float to unsigned integer conversion +unsigned int float2uint(float a, enum cudaRoundMode mode) +{ + return __internal_float2uint(a, mode); +} + +float __ll2float_rz(long long int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_TOWARDZERO); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __ll2float_ru(long long int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_UPWARD); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __ll2float_rd(long long int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_DOWNWARD); + float b = a; + fesetround(orig_rnd_mode); + return b; +} + #else + #define CUDA_FLOAT_MATH_FUNCTIONS -#include "/home/taamodt/nvcuda/2.3/cuda/include/device_types.h" +#define __CUDACC__ + +// implementing int to float intrinsics with different rounding modes +#include <device_types.h> +#include <fenv.h> + +// 32-bit integer to float +float __int2float_rn(int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_TONEAREST); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __int2float_rz(int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_TOWARDZERO); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __int2float_ru(int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_UPWARD); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __int2float_rd(int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_DOWNWARD); + float b = a; + fesetround(orig_rnd_mode); + return b; +} + +// 32-bit unsigned integer to float +float __uint2float_rn(unsigned int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_TONEAREST); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __uint2float_rz(unsigned int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_TOWARDZERO); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __uint2float_ru(unsigned int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_UPWARD); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __uint2float_rd(unsigned int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_DOWNWARD); + float b = a; + fesetround(orig_rnd_mode); + return b; +} + +// 64-bit integer to float +float __ll2float_rn(long long int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_TONEAREST); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __ll2float_rz(long long int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_TOWARDZERO); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __ll2float_ru(long long int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_UPWARD); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __ll2float_rd(long long int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_DOWNWARD); + float b = a; + fesetround(orig_rnd_mode); + return b; +} + +// 64-bit unsigned integer to float +float __ull2float_rn(unsigned long long int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_TONEAREST); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __ull2float_rz(unsigned long long int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_TOWARDZERO); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __ull2float_ru(unsigned long long int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_UPWARD); + float b = a; + fesetround(orig_rnd_mode); + return b; +} +float __ull2float_rd(unsigned long long int a) { + int orig_rnd_mode = fegetround(); + fesetround(FE_DOWNWARD); + float b = a; + fesetround(orig_rnd_mode); + return b; +} + +// float to integer conversion +int float2int(float a, enum cudaRoundMode mode) +{ + int tmp; + switch (mode) { + case cuda_math::cudaRoundZero: tmp = truncf(a); break; + case cuda_math::cudaRoundNearest: tmp = nearbyintf(a); break; + case cuda_math::cudaRoundMinInf: tmp = floorf(a); break; + case cuda_math::cudaRoundPosInf: tmp = ceilf(a); break; + default: abort(); + } + return tmp; +} + +int __internal_float2int(float a, enum cudaRoundMode mode) +{ + return float2int(a, mode); +} + +// float to unsigned integer conversion +unsigned int float2uint(float a, enum cudaRoundMode mode) +{ + unsigned int tmp; + switch (mode) { + case cuda_math::cudaRoundZero: tmp = truncf(a); break; + case cuda_math::cudaRoundNearest: tmp = nearbyintf(a); break; + case cuda_math::cudaRoundMinInf: tmp = floorf(a); break; + case cuda_math::cudaRoundPosInf: tmp = ceilf(a); break; + default: abort(); + } + return tmp; +} + +unsigned int __internal_float2uint(float a, enum cudaRoundMode mode) +{ + return float2uint(a, mode); +} + +// intrinsic for division +float fdividef(float a, float b) +{ + return (a / b); +} + +float __internal_accurate_fdividef(float a, float b) +{ + return fdividef(a, b); +} + +// intrinsic for saturate (clamp values beyond 0 and 1) +float __saturatef(float a) +{ + float b; + if (isnan(a)) b = 0.0f; + else if (a >= 1.0f) b = 1.0f; + else if (a <= 0.0f) b = 0.0f; + else b = a; + return b; +} + +// intrinsic for power +float __powf(float a, float b) +{ + return powf(a, b); +} + +#undef __CUDACC__ #define __CUDA_INTERNAL_COMPILATION__ -#include "/home/taamodt/nvcuda/2.3/cuda/include/math_functions.h" +#include <math_functions.h> #undef __CUDA_INTERNAL_COMPILATION__ #undef __attribute__ #endif |
