使用 Apple Accelerate Framework vForce 库来提高性能
Posted
技术标签:
【中文标题】使用 Apple Accelerate Framework vForce 库来提高性能【英文标题】:Using the Apple Accelerate Framework vForce library to improve performance 【发布时间】:2016-04-01 15:43:27 【问题描述】:我已成功实施 Apple 的 Accelerate Framework 中的 BLAS 库,以提高我的基本向量和矩阵运算的性能。
对此感到满意,我将注意力转向 vForce 以矢量化我的基本数学函数。与幼稚的实现(使用自动编译器优化 -Os)相比,这里的性能相当差,我有点惊讶。
作为一个简单的基准,我运行了以下测试:Matrix 是基本的 Matrix 类型,使用双指针,AccelerateMatrix 是 Matrix 的子类,它使用 vForce 中的幂函数:
Matrix A(vec_size);
AccelerateMatrix B(vec_size);
for (int i=0; i<vec_size;i++ )
A[i] = i;
B[i] = i;
double elapsed_time;
clock_t start = clock();
for(int i=0;i<reps;i++)
A.exp();
A.log();
clock_t stop = clock();
elapsed_time = (double)(stop-start)/CLOCKS_PER_SEC/reps;
cerr << "Basic matrix exponentiation/log time = " << elapsed_time << endl;
start = clock();
for(int i=0;i<reps;i++)
B.exp();
B.log();
stop = clock();
elapsed_time = (double)(stop-start)/CLOCKS_PER_SEC/reps;
cerr << "Accelerate matrix exponentiation/log time = " << elapsed_time << endl;
exponentiate/log 成员函数实现如下:
void AccelerateMatrix::exp()
int size =(int)this->getSize();
this->goToStart();
vvexp(this->ptr, this->ptr, &size);
void Matrix::exp()
double *ptr = data;
while (!atEnd())
*ptr = std::exp(*ptr);
ptr++;
data 是指向双精度数组第一个元素的指针。
以下是表演的输出:
矩阵元素数 = 1000000
基本矩阵求幂/对数时间(秒)= 0.0089806
加速矩阵求幂/对数时间(秒)= 0.0149955
我在发布模式下从 XCode 运行。 我的处理器是 2.3 GHz Intel Core i7。 内存为 8 GB 1600 MHz DDR3。
【问题讨论】:
【参考方案1】:看来问题与 vForce 如何操纵内存有关。本质上,它并不擅长一次性处理大型矩阵。对于vec_size = 1000;
,vForce 计算指数/对数的速度是编译器优化的幼稚版本的两倍。我将较大的示例vec_size = 1000000
分解为每批 1000 个,你瞧,vForce 实现的速度是简单实现的两倍。不错!
【讨论】:
您在使用 BLAS 时是否发现了类似情况? @MauryMarkowitz Accelerate 框架在技术上是一个 BLAS 实现。我还没有实现 OpenBLAS,但据报道它的性能是相似的。一旦我实施了它,我将在这里报告我的发现。据称,英特尔 MKL 也提供了类似(如果不是稍微好一点)的性能(尽管它不是免费的)。抱歉,我手头没有基准,我记得那是一个非常简单的谷歌搜索。 是的,我并不担心性能本身,只是寻找您可能见过的任何“陷阱”,例如上面的那个。我下个月开始实施我的应用程序的这一部分。 vForce 不操作内存。那是你的工作。它只是按照你告诉它的地方去做。问题是您超出了 L1 和 L2 缓存的大小,并且正在消耗延迟到 L3。在 16 kB 的块上做你的 log 和 exp,它会工作得更好。以上是关于使用 Apple Accelerate Framework vForce 库来提高性能的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apple Accelerate 框架的希尔伯特变换(分析信号)?
何时在 Apple macOS 上使用 Metal 而不是 Accelerate API
Apple Accelerate Framework 缩放和规范化矢量