首页 > 解决方案 > CUDA 和 C++ 之间的 static_casting 行为不一致

问题描述

我试图弄清楚为什么 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 %lld\n", x, -x, FLOAT_TO_FIXED(-x), -FLOAT_TO_FIXED(x));
}

void debug_cpu(double x) {
    printf("x %.5f -x %.5f cpu %lld %lld\n", 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
*/

标签: c++cuda

解决方案


您似乎在否定 64 位值 -9223372036854775808,这会导致有符号整数溢出(9223372036854775808 的值不能用 64 位有符号整数表示)。这是C 和 C++ 中未定义的行为。这意味着您可以获得任何结果,具体取决于编译器和执行程序的硬件。


推荐阅读