c++ - 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
*/
解决方案
您似乎在否定 64 位值 -9223372036854775808,这会导致有符号整数溢出(9223372036854775808 的值不能用 64 位有符号整数表示)。这是C 和 C++ 中未定义的行为。这意味着您可以获得任何结果,具体取决于编译器和执行程序的硬件。
推荐阅读
- php - 当 Laravel 后端部署在 Heroku 中时,将 React 项目部署到 Netlify 是否有效?
- perl - 如何使用 LWP 显式设置 cookie
- codenameone - 泛化代码以捕获和裁剪照片
- python - QUdpSocket 在 PyQt5 中没有 writeDatagram() 函数吗?
- d3.js - d3.js 中的时间格式 (%"Y")
- java - 有没有更好的方法来使用 Java 中的特定本地 IP 地址执行 ICMP Ping
- angular7 - 如何在 Angular 中动态显示 404
- godot - 如何将 queue_free() 与 Area2D 一起使用
- javascript - 如何通过对象数组中的键值合并或连接数据?
- javascript - 让 react-dropzone 接受 *all* 文件