我不明白OpenCL native_
前缀函数的原因。文档说:
具有native_前缀的函数可以映射到一个或多个本机设备 说明并且通常会有更好的性能 相应的函数(没有native__前缀)。该 这些功能的准确度(在某些情况下是输入范围)是 实现定义的。
好的,所以我认为native_
函数可能会稍快一些,但准确性稍差。还有其他优点和缺点吗?在哪种用例中我可能想要使用log()
与native_log()
之类的内容?
如果这是一个愚蠢的问题,请道歉。我想确保掌握native_
函数存在的根本原因。
答案 0 :(得分:5)
如果要发布在所有可能设备上使用的软件,则应使用常规功能,因为您永远不会知道对native_function的期望。或者你可以做一个简单的测试来检查你是否想要使用native_,作为一个例子,计算一系列感兴趣的范围内的值,看看它们是否足够接近。
native_function最重要的部分是它们的精度完全是实现定义的。这很重要,因为OpenCL数值精度规范的某些部分是相当愚蠢的。作为一个例子,规范要求sin具有相对4 ULP的精度,这对于振荡函数非常有趣,并且当输入ULP值变高时使得实现非常困难。
在实践中,native_实现通常与您对设备的期望非常相似。在GPU上,native_function通常是DirectX规范中定义的。有些人甚至有更好的实施。作为AMD硬件的一个例子,与正常罪相比,native_sin函数非常快,根据我的经验,它具有输入值为1 ULP的绝对误差。在Intel集成GPU上,native_sin非常不精确,但仍然在DirectX规范中。
原生函数在规范中的原因是允许不关心OpenCL规范所要求的极高精度的用户使用效果更好的东西。
tl; dr:如果你可以使用native_函数来做,因为它们通常比普通函数快得多。