【发布时间】:2021-08-05 11:53:45
【问题描述】:
为什么用 Numpy 进行矩阵乘法比 GSL 中的gsl_blas_sgemm 快得多,例如:
import numpy as np
import time
N = 1000
M = np.zeros(shape=(N, N), dtype=np.float)
for i in range(N):
for j in range(N):
M[i, j] = 0.23 + 100*i + j
tic = time.time()
np.matmul(M, M)
toc = time.time()
print(toc - tic)
给出 0.017 - 0.019 秒之间的时间,而在 C++ 中:
#include <chrono>
#include <iostream>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>
using namespace std::chrono;
int main(void) {
int N = 1000;
gsl_matrix_float* M = gsl_matrix_float_alloc(N, N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
gsl_matrix_float_set(M, i, j, 0.23 + 100 * i + j);
}
}
gsl_matrix_float* C = gsl_matrix_float_alloc(N, N); // save the result into C
auto start = high_resolution_clock::now();
gsl_blas_sgemm(CblasNoTrans, CblasNoTrans, 1.0, M, M, 0.0, C);
auto stop = high_resolution_clock::now();
auto duration = duration_cast<milliseconds>(stop - start);
std::cout << duration.count() << std::endl;
return 0;
}
我得到了大约 2.7 秒的乘法运行时间。我也在使用最大速度选项/02 进行编译。我正在使用 Visual Studio。我必须做一些非常错误的事情。我并不期望 C++ 代码有更好的性能,因为我知道 Numpy 是优化的 C 代码,但我也不期望它比 python 慢 150 倍。这是为什么?相对于 Numpy,如何提高乘法的运行时间?
问题背景: 我需要评估一个 1000 到 2000 维的积分,我正在使用 Monte-Carlo 方法进行评估。为此,我几乎将整个被积函数编写为 Numpy 数组操作,它的工作速度非常快,但我需要它更快,以便将相同的被积函数评估 100.000 到 500.000 次,因此任何一点改进都会有所帮助。用 C/C++ 编写相同的代码有意义还是我应该坚持使用 Numpy?谢谢!
【问题讨论】:
标签: python c++ performance numpy gsl