我刚刚看到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会更好。

09-25 16:37