使用 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 Accelerate框架有时会很慢?

何时在 Apple macOS 上使用 Metal 而不是 Accelerate API

Apple Accelerate Framework 缩放和规范化矢量

如何从链接到 Apple Accelerate 框架的源代码构建 NumPy?

Apple Accelerate vDSP fft vs DFT 和比例因子