CUDA是否会悄悄降下双浮
Does CUDA quietly downcasts double to float?
我正在查看CUDA头文件cuda/6.5.14/RHEL6.x/include/math_functions_dbl_ptx1.h
,并看到每个接受double
参数的算术函数将其转换为float
:
static __forceinline__ double fabs(double a)
{
return (double)fabsf((float)a);
}
...
static __forceinline__ double floor(double a)
{
return (double)floorf((float)a);
}
由于我在本质上依赖于双精度浮点数(代码中有相当多潜在的灾难性取消),所以我很难相信自己的眼睛。
你能解释一下这是怎么回事吗?
您正在查看的是编译cc1.1或cc1.2设备(在CUDA 6.5上)时使用的文件,该设备没有对double
算术的本机支持,是的CUDA会"悄悄地"降级"double
到float
。(当发生这种情况时,编译器会发出警告。)
此行为在计算能力为1.3及以上的设备上没有表现出来,这些设备都具有对double
算法的本地支持。
CUDA 7和7.5不再支持计算能力低于2.0的设备,所以这个特殊的行为不再表现出来,它只在较新的CUDA工具包中成为历史兴趣。(有问题的文件已从这些较新的CUDA工具包中删除)
作为参考,当这种"降级"发生时,编译器将发出以下形式的警告:
ptxas /tmp/tmpxft_00000949_00000000-2_samplefilename.ptx, line 65; warning : Double is not supported. Demoting to float
如果在编译输出中没有看到该警告,则表示降级没有发生。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- C/C++预处理器是否可以检测一些编译器选项
- CUDA是否会悄悄降下双浮