来自Accelerate的tanh与来自C的tanh

时间:2015-01-05 09:39:49

标签: ios c accelerate-framework

我刚看到Accelerate框架有这个: 我有一个可以进行大量计算的函数。

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

2 个答案:

答案 0 :(得分:4)

注意:您的问题和我的原始答案有一些拼写错误。要执行tanh,您的意思是vvtanh,而不是vvatanh(或我最初写的vatanh)。 vv表示" vector" (技术上来自vForce库。vvatanh是矢量基双曲正切。)

首先,应该明显的一点是:如果vvtanh普遍比tanh更快/更好,那么tanh只会被实现为vvtanh。两者都存在强烈的事实表明它们有不同的目的或权衡。正如其他人所说,分析很重要,但仅仅分析并不总是足够。您需要了解函数的使用方式,否则您的分析会告诉您Accelerate非常缓慢且毫无用处。

Accelerate中的向量函数旨在同时有效地处理数字的大向量(数组)。为了使它们有用,您必须正确地构建数据。在单个值上调用向量函数通常会比非向量形式慢,因为向量形式必然在其内部具有某种迭代逻辑。编译器和标准库总是可以自由地使用向量处理器(和do);你不应该想象Accelerate可以访问其他地方没有的任何神奇的快速指令。区别在于使用的算法,而不是矢量处理器本身。

所以,如果你有一大组数字排列在一个C阵列中并需要一次计算tanh,那么vvtanh可能是一个很好的工具,你应该对其进行分析。如果不出意外,您可以保存迭代tanh的函数调用开销(前提是它没有内联)。

如果您的问题没有采用这种方式构建,那么您应该尝试重新设计数据结构和算法,以便可以以这种方式构建问题。大多数矢量化的使用都是以正确的形式获取数据,然后进行单个函数调用。

如果您无法以这种方式构建数据,并且您将被迫多次致电vvtanh,那么它几乎肯定会失败,而且更简单tanh会好起来的。

答案 1 :(得分:3)

正如其他人所指出的,如果你担心表现,你需要仔细试验。

但是,有一些因素会影响绩效:

1:Accelerate是一个向量运算库,如果可用,它在向量硬件上进行硬件加速。 API采用操作数向量,并通过仔细的指令和缓存调度获得一些收益。如果您没有执行大量操作,则该功能的成本可能开始占主导地位。如果您只是在一次操作之后,它就不太可能更快。

2:编译器使用本机指令内联标准库函数是公平的。在不查看编译器生成的程序集的情况下,很难知道它是否成功。

3:有许多近似值可用于计算tanh()。它们的适用性在很大程度上取决于输入值的范围和应用所要求的精度。加速可能正在使用这样的近似值,并不像std lib那样准确。

相关问题