我知道使用==
检查浮点变量的相等性不是一个好方法。但我只想通过以下陈述来了解这一点:
float x = ...
float y = x;
assert(y == x)
Run Code Online (Sandbox Code Playgroud)
既然y
是从 复制的x
,那么这个断言是真的吗?
我今天正在阅读研究人员发现NVidia的Phys-X库使用x87 FP与SSE2.显然,对于速度超过精度的并行数据集来说,这将是次优的.然而,文章作者继续引用:
英特尔在2000年末引入P4后开始不鼓励使用x87.AMD自2003年K8以来已弃用x87,因为x86-64定义为SSE2支持; VIA的C7自2005年以来一直支持SSE2.在64位版本的Windows中,x87不适用于用户模式,完全禁止在内核模式下使用.自2005年以来,业内所有人都推荐SSE超过x87,除非软件必须在嵌入式Pentium或486上运行,否则没有理由使用x87.
我想知道这件事.我知道x87内部使用80位扩展双精度值来计算值,而SSE2则不然.这对任何人都没关系吗?这对我来说似乎很惊讶.我知道当我对平面中的点,线和多边形进行计算时,在进行减法时,值可能出乎意料地错误,并且由于缺乏精度,区域可能会折叠并且线条会相互别名.我想,使用80位值与64位值可能会有所帮助.
这是不正确的?如果没有,如果x87被淘汰,我们可以用什么来执行扩展的双FP操作?
我想使用 CUDA 在 GPU 中实现一个算法。同时我用C++写了一个CPU版本来验证GPU版本的结果。但是我log()
在 CPU 和 GPU 中使用时遇到了麻烦。一个非常简单的算法(在 CPU 和 GPU 上都使用)如下所示:
float U;
float R = U * log(U);
Run Code Online (Sandbox Code Playgroud)
但是,当我比较 CPU 端的结果时,我发现有很多结果(1843161 中的 459883)具有很小的差异(最大差异为 0.5)。部分结果如下所示:
U -- R (CPU side) -- R (GPU side) -- R using Python (U * math.log(U))
86312.0 -- 980998.375000 -- 980998.3125 -- 980998.3627440572
67405.0 -- 749440.750000 -- 749440.812500 -- 749440.7721980268
49652.0 -- 536876.875000 -- 536876.812500 -- 536876.8452369706
32261.0 -- 334921.250000 -- 334921.281250 -- 334921.2605240216
24232.0 -- 244632.437500 -- 244632.453125 -- 244632.4440747978 …
Run Code Online (Sandbox Code Playgroud)