假设我想在CUDA内核中对x
除以y
进行(单精度(除法,不管其他什么,都会得到一个四舍五入的结果(=四舍五舍五入到正无穷大(。这很容易:而不是:
float r = x / y;
我写:
float r = __fdiv_ru(x, y);
我可以对rn
(舍入最近(、rd
等做同样的操作
我如何在OpenCL中做同样的事情?
如果我查看数学函数的文档(OpenCL 3.0(,我只找到native_divide
,并被告知:
内置数学函数不受调用环境中盛行的舍入模式的影响,并且始终返回与使用舍入到最接近的偶数舍入模式调用时相同的值。
所以,这不是办法。做什么我做什么?
根据这个页面,有一个扩展可以让我们做到这一点。
启用扩展后,这应该会起作用:
#pragma OPENCL SELECT_ROUNDING_MODE rtp
float r = x / y;
(这里,"rtp"代表四舍五入到正无穷大=四舍五进。(
不幸的是,该扩展被否决了,我不确定我们是否可以"信任;这种方法。这显然也涉及到某种宏观伎俩。