2013-12-12 52 views
3

我不明白OpenCL native_前缀函数的原因。文档说:OpenCL native_函数做什么?

与native_前缀

函数可以映射到一个或多个本机设备 指令和更好的性能相比 相应的功能(不native__前缀)将典型地具有。这些函数的准确性(以及在某些情况下的输入范围)是实现定义的 。

好吧,所以我得到native_功能可能会稍微快一点,准确性稍差。有没有其他的优点和缺点?在什么使用情况下,我想使用log()还是native_log()

道歉,如果这是一个愚蠢的问题。我想确保我明白native_函数存在的根本原因。

+1

这基本上是一个速度/准确性的折衷。 native_函数可能会更快,但非'native_'函数可以保证准确性,这取决于你在做什么。我认为没有任何其他的权衡。 – Thomas

回答

4

如果你想发布在所有可能的设备上使用的软件,你应该使用正常的功能,因为你永远不知道从native_函数会得到什么。或者你可以做一个简单的测试,检查你是否想使用native_或者不是,例如计算感兴趣范围内的一堆值,看看它们是否足够接近。

native_函数最重要的部分是它们的精度完全是实现定义的。这很重要,因为OpenCL数值精度规范的某些部分实际上很愚蠢。作为一个例子,规范要求sin具有相对4的ULP精度,这对于振荡函数来说非常有趣,并且在输入ULP值变高时使得实现非常困难。

在实践中,native_实现通常非常符合您对设备的期望。在GPU上,native_函数通常是DirectX规范中定义的。有些甚至有更好的实现。作为AMD HW的一个例子,native_sin函数与正常的sin相比是非常快的,从我的经验来看,它具有1 ULP输入值的绝对误差。在Intel集成GPU上,native_sin相当不精确,但仍在DirectX规范中。

native_函数在spec中的原因是允许不关心OpenCL规范所要求的极端精度的用户使用性能更好的东西。

tl; dr:如果您可以使用native_函数,那么可以这样做,因为它们通常比正常函数快得多。