【发布时间】:2022-01-01 12:16:30
【问题描述】:
我正在使用犰狳做一些基本的乘法运算,但由于某种原因,它需要很长时间才能完成。我对 c++ 很陌生,所以我可能做错了什么,但即使在这个非常基本的例子中我也看不到它:
#include <armadillo>
#include <iostream>
using namespace arma;
int main(){
arma::vec coefficients = {1.0, 1.09, 1.08};
arma::mat X = arma::mat(100000, 3, fill::randu) * coefficients;
cout << X.n_cols;
}
当我的意思是非常慢时,我已经运行了这个示例几分钟但没有完成
编辑
我使用perf stat ./main 运行脚本,但在一段时间后停止了它,因为它不应该花那么长时间。这是输出。
^C./main: Interrupt
Performance counter stats for './main':
257,169.20 msec task-clock # 1.003 CPUs utilized
3,342 context-switches # 12.995 /sec
215 cpu-migrations # 0.836 /sec
1,312 page-faults # 5.102 /sec
963,025,520,077 cycles # 3.745 GHz
542,959,361,927 instructions # 0.56 insn per cycle
113,002,342,332 branches # 439.409 M/sec
1,095,168,312 branch-misses # 0.97% of all branches
256.349026907 seconds time elapsed
147.860947000 seconds user
109.317743000 seconds sys
【问题讨论】:
-
这对我来说似乎很快。你是怎么编译的?
-
g++ 默认优化级别为
-O0或“编译时间优化”。试试g++ -O3 main.cpp -o main -larmadillo -
@JérômeRichard 花了我一段时间来安装 perf。但我更新了问题
-
查看文档我的怀疑是:矩阵存储方式错误。转置它并做一个转置产品。更适合缓存、TLB 等。
-
将编译代码改为
g++ main.cpp -o main -DARMA_DONT_USE_WRAPPER -larmadillo -llapack即可解决问题。我很乐意接受任何解释原因的人的回答。