我想弄清楚为什么以下行为在CUDA和c++之间不一致。注意,x的值是完全相同的,似乎是static_casting不一致。
#include <cstdio>
template<typename RealType>
long long __host__ __device__ __forceinline__ FLOAT_TO_FIXED(RealType v) {
return (long long)(v);
}
void __global__ debug_gpu(double x) {
printf("x %.5f -x %.5f gpu %lld %lldn", x, -x, FLOAT_TO_FIXED(-x), -FLOAT_TO_FIXED(x));
}
void debug_cpu(double x) {
printf("x %.5f -x %.5f cpu %lld %lldn", x, -x, FLOAT_TO_FIXED(-x), -FLOAT_TO_FIXED(x));
}
int main() {
double x = static_cast<double>(131154376256114819072.0);
debug_gpu<<<1, 1>>>(x);
cudaDeviceSynchronize();
debug_cpu(x);
}
/*
x 131154376256114819072.00000 -x -131154376256114819072.00000 gpu -9223372036854775808 -9223372036854775807
x 131154376256114819072.00000 -x -131154376256114819072.00000 cpu -9223372036854775808 -9223372036854775808
*/
您似乎正在否定64位值-9223372036854775808,这会导致有符号整数溢出(9223372036854775808的值在64位有符号整数中不可表示)。这在C和c++中是未定义的行为。这意味着你可以得到任何结果,这取决于编译器和执行程序的硬件。