gpt4 book ai didi

python - Eigen 矩阵乘法比 cblas 慢?

转载 作者:行者123 更新时间:2023-11-30 05:19:58 32 4
gpt4 key购买 nike

我使用以下代码来测试 Eigen 性能。

#include <iostream>
#include <chrono>
#define EIGEN_NO_DEBUG
#include <eigen3/Eigen/Dense>
#include <cblas.h>
using namespace std;
using namespace std::chrono;

int main()
{
int n = 3000;

high_resolution_clock::time_point t1, t2;

Eigen::MatrixXd A(n, n), B(n, n), C(n, n);

t1 = high_resolution_clock::now();
C = A * B;
t2 = high_resolution_clock::now();
auto dur = duration_cast<milliseconds>(t2 - t1);
cout << "eigen: " << dur.count() << endl;

t1 = high_resolution_clock::now();
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
n, n, n, 1.0, A.data(), n, B.data(), n, 1.0, C.data(), n);
t2 = high_resolution_clock::now();
dur = duration_cast<milliseconds>(t2 - t1);
cout << "cblas: " << dur.count() << endl;

return 0;
}

我用下面的命令编译它:

g++ test.cpp  -O3 -fopenmp -lblas -std=c++11 -o test

结果是:

Eigen :1422 毫秒

cblas:432 毫秒

我做错了什么吗?根据他们的基准,它应该更快。

另一个问题是使用 numpy 我得到 24 毫秒

import time 
import numpy as np

a = np.random.random((3000, 3000))
b = np.random.random((3000, 3000))
start = time.time()
c = a * b
print("time: ", time.time() - start)

最佳答案

说您正在使用 cblas 提供的信息非常少,因为 cblas 只是一个 API。底层 BLAS 库可以是 netlib 的 BLAS、OpenBLAS、ATLAS、Intel MKL、Apple 的 Accelerate,甚至是 EigenBlas...根据您的测量,很明显您的底层 BLAS 是一个利用 AVX+FMA+多线程的高度优化的库.因此,为了公平比较,您还必须通过编译 -march=native -fopenmp 启用 Eigen 方面的这些功能,并确保您使用的是 Eigen 3.3。那么性能应该差不多。

关于 numpy,Warren Weckesser 已经解决了这个问题。您可能自己发现,在标准计算机上执行 2*3000^3=54e9 浮点运算需要 24 毫秒是不可能的。

关于python - Eigen 矩阵乘法比 cblas 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40904246/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com