来自 Accelerate 的 tanh 与 C 中的 tanh
tanh from Accelerate vs tanh in C
我刚刚看到Accelerate框架有这个:
我有一个函数可以进行大量 tanh 计算。
void vvatanh (double *, const double *, const int * );
https://developer.apple.com/library/ios/documentation/Performance/Conceptual/vecLib/#//apple_ref/c/func/vvatanh
与 C 代码中的 tanh 相比,这是否更快?
http://www.tutorialspoint.com/c_standard_library/c_function_tanh.htm
正如其他人指出的那样,如果您担心性能,则需要仔细试验。
但是,有一些因素会影响性能:
1:Accelerate 是一个矢量运算库,如果可用,可以在矢量硬件上进行硬件加速。 API 采用操作数向量,并通过仔细的指令和缓存调度获得一些收益。如果您不执行大量操作,则函数的成本可能开始占主导地位。如果您只是在进行一次操作之后,它不太可能会更快。
2: 编译器使用本机指令内联标准库函数是公平的。如果不查看编译器生成的程序集,就很难知道它是否这样做了。
3:有许多近似值可用于计算tanh()
。它们的适用性在很大程度上取决于输入值的范围和应用程序要求的精度。 Accelerate 很可能正在使用这样的近似值,并且不如标准库准确。
注意:你的问题和我原来的回答有一些错别字。要执行 tanh,您的意思是 vvtanh
,而不是 vvatanh
(或我最初写的 vatanh
)。 vv
表示 "vector"(技术上来自 vForce 库。vvatanh
是向量基数 inverse 双曲正切。)
首先,显而易见的一点:如果 vvtanh
比 tanh
普遍 faster/better,那么 tanh
将简单地实现为 vvtanh
.两者都存在的事实强烈表明它们有不同的目的或权衡。正如其他人所说,分析很重要,但仅靠分析并不总是足够的。您需要了解这些函数的使用方式,否则您的分析会告诉您 Accelerate 出奇地慢且毫无用处。
Accelerate 中的矢量函数旨在同时高效地处理大型数字矢量(数组)。为了使它们有用,您必须正确地构建数据。在单个值上调用向量函数通常会比非向量形式慢,因为向量形式内部必然有某种迭代逻辑。编译器和标准库总是可以免费使用矢量处理器(并且这样做);您不应该认为 Accelerate 可以访问其他地方无法获得的任何神奇的快速指令。区别在于使用的算法,而不是向量处理器本身。
所以,如果你有一大组排列在 C 数组中的数字,并且需要一次计算它们的 tanh
,那么 vvtanh
可能是一个很好的工具,你应该剖析它。如果不出意外,您可以节省迭代 tanh
的函数调用开销(前提是它没有内联)。
如果您的问题不是这样构造的,那么您应该尝试重新设计您的数据结构和算法,以便问题可以那样构造。矢量化的大部分用途是以正确的形式获取数据,然后进行单个函数调用。
如果您不能以这种方式构建数据,并且您将被迫多次调用 vvtanh
,那么几乎肯定会失败,而更简单的 tanh
将是更好。
我刚刚看到Accelerate框架有这个: 我有一个函数可以进行大量 tanh 计算。
void vvatanh (double *, const double *, const int * ); https://developer.apple.com/library/ios/documentation/Performance/Conceptual/vecLib/#//apple_ref/c/func/vvatanh
与 C 代码中的 tanh 相比,这是否更快? http://www.tutorialspoint.com/c_standard_library/c_function_tanh.htm
正如其他人指出的那样,如果您担心性能,则需要仔细试验。
但是,有一些因素会影响性能:
1:Accelerate 是一个矢量运算库,如果可用,可以在矢量硬件上进行硬件加速。 API 采用操作数向量,并通过仔细的指令和缓存调度获得一些收益。如果您不执行大量操作,则函数的成本可能开始占主导地位。如果您只是在进行一次操作之后,它不太可能会更快。
2: 编译器使用本机指令内联标准库函数是公平的。如果不查看编译器生成的程序集,就很难知道它是否这样做了。
3:有许多近似值可用于计算tanh()
。它们的适用性在很大程度上取决于输入值的范围和应用程序要求的精度。 Accelerate 很可能正在使用这样的近似值,并且不如标准库准确。
注意:你的问题和我原来的回答有一些错别字。要执行 tanh,您的意思是 vvtanh
,而不是 vvatanh
(或我最初写的 vatanh
)。 vv
表示 "vector"(技术上来自 vForce 库。vvatanh
是向量基数 inverse 双曲正切。)
首先,显而易见的一点:如果 vvtanh
比 tanh
普遍 faster/better,那么 tanh
将简单地实现为 vvtanh
.两者都存在的事实强烈表明它们有不同的目的或权衡。正如其他人所说,分析很重要,但仅靠分析并不总是足够的。您需要了解这些函数的使用方式,否则您的分析会告诉您 Accelerate 出奇地慢且毫无用处。
Accelerate 中的矢量函数旨在同时高效地处理大型数字矢量(数组)。为了使它们有用,您必须正确地构建数据。在单个值上调用向量函数通常会比非向量形式慢,因为向量形式内部必然有某种迭代逻辑。编译器和标准库总是可以免费使用矢量处理器(并且这样做);您不应该认为 Accelerate 可以访问其他地方无法获得的任何神奇的快速指令。区别在于使用的算法,而不是向量处理器本身。
所以,如果你有一大组排列在 C 数组中的数字,并且需要一次计算它们的 tanh
,那么 vvtanh
可能是一个很好的工具,你应该剖析它。如果不出意外,您可以节省迭代 tanh
的函数调用开销(前提是它没有内联)。
如果您的问题不是这样构造的,那么您应该尝试重新设计您的数据结构和算法,以便问题可以那样构造。矢量化的大部分用途是以正确的形式获取数据,然后进行单个函数调用。
如果您不能以这种方式构建数据,并且您将被迫多次调用 vvtanh
,那么几乎肯定会失败,而更简单的 tanh
将是更好。