使用 Apple Accelerate Framework vForce 库提高性能
Using the Apple Accelerate Framework vForce library to improve performance
我已成功实施 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
基本矩阵exponentiation/log时间(秒)= 0.0089806
加速矩阵exponentiation/log时间(秒)= 0.0149955
我是 运行 来自 XCode 的发布模式。
我的处理器是 2.3 GHz Intel Core i7。
内存为 8 GB 1600 MHz DDR3。
问题似乎与 vForce 操纵内存的方式有关。本质上它不擅长一次性处理大型矩阵。对于 vec_size = 1000;
,vForce 计算 exponential/log 的速度是编译器优化的原始版本的两倍。我将较大的示例 vec_size = 1000000
分成了一批,每批 1000 个,你瞧,vForce 实施的速度是原始实施的两倍。不错!
我已成功实施 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
基本矩阵exponentiation/log时间(秒)= 0.0089806
加速矩阵exponentiation/log时间(秒)= 0.0149955
我是 运行 来自 XCode 的发布模式。 我的处理器是 2.3 GHz Intel Core i7。 内存为 8 GB 1600 MHz DDR3。
问题似乎与 vForce 操纵内存的方式有关。本质上它不擅长一次性处理大型矩阵。对于 vec_size = 1000;
,vForce 计算 exponential/log 的速度是编译器优化的原始版本的两倍。我将较大的示例 vec_size = 1000000
分成了一批,每批 1000 个,你瞧,vForce 实施的速度是原始实施的两倍。不错!