我刚刚看到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
最佳答案
注意:您的问题和我的原始答案有一些错别字。要执行tanh,您的意思是vvtanh
,而不是vvatanh
(或我最初写的vatanh
)。 vv
表示“向量”(技术上来自vForce库。vvatanh
是向量基础反双曲正切。)
首先,这一点应该很明显:如果vvtanh
普遍比tanh
更快/更好,那么tanh
可以简单地实现为vvtanh
。两者都存在的事实强烈表明它们具有不同的目的或权衡。就像其他人所说的那样,分析很重要,但是仅仅进行分析并不总是足够的。您需要了解这些功能的含义,否则您的配置文件将告诉您Accelerate极其缓慢且无用。
Accelerate中的向量函数旨在有效地同时处理数字的大型向量(数组)。为了使它们有用,您必须正确构造数据。通常,对单个值调用向量函数要比非向量形式慢,因为向量形式内部必然具有某种迭代逻辑。编译器和标准库始终可以自由使用矢量处理器(并且可以这样做);您不应想象Accelerate可以访问任何其他地方都没有的神奇的快速上手说明。不同之处在于所使用的算法,而不是矢量处理器本身。
因此,如果您将大量数字排列在一个C数组中,并且需要一次对所有数字计算tanh
,那么vvtanh
可能是一个不错的工具,应该对其进行概要分析。如果没有其他问题,您可以节省遍历tanh
的函数调用开销(前提是未内联)。
如果问题不是通过这种方式构造的,则应尝试重新设计数据结构和算法,以便可以通过这种方式构造问题。向量化的大多数用途是使数据以正确的形式出现,然后进行单个函数调用。
如果您无法以这种方式构造数据,并且将不得不多次调用vvtanh
,那么几乎肯定会失败,并且更简单的tanh
会更好。