对于矩阵运算,著名的C++库有Eigen与C++版本的Numpy——NumCpp,Python库有NumPy与带GPU加速的Numpy版本CuPy。博客园|Eigen vs Numpy时间对比中对Eigen与Numpy的效率进行了比较,但是比较时忽略了C++的编译模式[DeBug与Release]对结果的影响,对比出的结果是不够准确的。本篇对Eigen、NumCpp、NumPy以及CuPy四种主流矩阵运算库的计算效率进行比较,以备实战时作为考量的一点依据。
一、测试项目
本博客主要测试四种库对静态矩阵与动态矩阵运算的效率,主要分为两个项目:一)静态矩阵计算;二)动态矩阵计算。
二、静态矩阵计算效率测试
2.1 测试数据与函数
假定有向量集D = { d ⃗ 1 ∈ R M × 1 , . . . , d ⃗ N ∈ R M × 1 } D=\{\vec{d}_{1}\in R^{M\times 1},...,\vec{d}_{N}\in R^{M\times 1}\}D={d1∈RM×1,...,dN∈RM×1}与向量x ⃗ ∈ R M × 1 \vec{x}\in R^{M\times 1}x∈RM×1,测试计算以下函数为:
y i = exp ( − ∣ ∣ x ⃗ − d ⃗ i ∣ ∣ 2 2 δ 2 ) , i = 1 , 2 , . . . , 2000 y_{i}=\exp(\frac{-||\vec{x}-\vec{d}_{i}||^{2}}{2\delta^2}),i=1,2,...,2000yi=exp(2δ2−∣∣x−di∣∣2),i=1,2,...,2000
测试数据总共分成三类:
1)小型矩阵与向量计算,N = M = 20 N=M=20N=M=20;
2)中型矩阵与向量计算,N = M = 200 N=M=200N=M=200;
3) 大型矩阵与向量计算,N = M = 2000 N=M=2000N=M=2000。
2.2 测试程序
- double型
<span style="color:#000000"><code class="language-cpp"><span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><iostream></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><vector></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><fstream></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><cmath></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><sys/timeb.h></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c">"iomanip"</span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><Eigen/Dense></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c">"NumCpp.hpp"</span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c">"boost/filesystem.hpp"</span></span>
<span style="color:#ff79c6">using</span> <span style="color:#ff79c6">namespace</span> Eigen<span style="color:#999999">;</span>
<span style="color:#ff79c6">using</span> <span style="color:#ff79c6">namespace</span> std<span style="color:#999999">;</span>
<span style="color:#ff79c6">int</span> M <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">2000</span><span style="color:#999999">;</span> <span style="color:#6272a4">// 20 200 2000</span>
<span style="color:#ff79c6">int</span> N <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">2000</span><span style="color:#999999">;</span> <span style="color:#6272a4">// 20 200 2000</span>
Eigen<span style="color:#6272a4">::</span>RowVectorXd <span style="color:#8be9fd">construct_Phi2eigen</span><span style="color:#999999">(</span>Eigen<span style="color:#6272a4">::</span>Vector2d x<span style="color:#999999">,</span> Eigen<span style="color:#6272a4">::</span>Matrix2Xd ALD_mat<span style="color:#999999">)</span>
<span style="color:#999999">{</span>
<span style="color:#ff79c6">double</span> delta <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">1.2</span><span style="color:#999999">;</span>
Eigen<span style="color:#6272a4">::</span>Matrix2Xd dmat <span style="color:#6272a4">=</span> ALD_mat<span style="color:#999999">.</span><span style="color:#8be9fd">colwise</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#6272a4">-</span> x<span style="color:#999999">;</span>
Eigen<span style="color:#6272a4">::</span>Matrix2Xd dmat2 <span style="color:#6272a4">=</span> dmat<span style="color:#999999">.</span><span style="color:#8be9fd">array</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">.</span><span style="color:#8be9fd">pow</span><span style="color:#999999">(</span><span style="color:#f1fa8c">2</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
Eigen<span style="color:#6272a4">::</span>RowVectorXd dmat2sum <span style="color:#6272a4">=</span> <span style="color:#6272a4">-</span>dmat2<span style="color:#999999">.</span><span style="color:#8be9fd">colwise</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">.</span><span style="color:#8be9fd">sum</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#6272a4">/</span><span style="color:#999999">(</span><span style="color:#f1fa8c">2.0</span><span style="color:#6272a4">*</span>delta<span style="color:#6272a4">*</span>delta<span style="color:#999999">)</span><span style="color:#999999">;</span>
Eigen<span style="color:#6272a4">::</span>RowVectorXd y <span style="color:#6272a4">=</span> dmat2sum<span style="color:#999999">.</span><span style="color:#8be9fd">array</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">.</span><span style="color:#8be9fd">exp</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">return</span> y<span style="color:#999999">;</span>
<span style="color:#999999">}</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span> <span style="color:#8be9fd">contruct_Phi2numcpp</span><span style="color:#999999">(</span>nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span> x<span style="color:#999999">,</span> nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span> ALD_buf<span style="color:#999999">)</span>
<span style="color:#999999">{</span>
<span style="color:#ff79c6">double</span> delta <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">1.2</span><span style="color:#999999">;</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span> c <span style="color:#6272a4">=</span> ALD_buf <span style="color:#6272a4">-</span> nc<span style="color:#6272a4">::</span><span style="color:#8be9fd">tile</span><span style="color:#999999">(</span>x<span style="color:#999999">,</span> <span style="color:#999999">{</span>ALD_buf<span style="color:#999999">.</span><span style="color:#8be9fd">shape</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">.</span>rows <span style="color:#999999">,</span> <span style="color:#f1fa8c">1</span><span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span> e <span style="color:#6272a4">=</span> nc<span style="color:#6272a4">::</span><span style="color:#8be9fd">exp</span><span style="color:#999999">(</span><span style="color:#6272a4">-</span>nc<span style="color:#6272a4">::</span><span style="color:#8be9fd">sum</span><span style="color:#999999">(</span>nc<span style="color:#6272a4">::</span><span style="color:#8be9fd">power</span><span style="color:#999999">(</span>c<span style="color:#999999">,</span> <span style="color:#f1fa8c">2</span><span style="color:#999999">)</span><span style="color:#999999">,</span> nc<span style="color:#6272a4">::</span>Axis<span style="color:#6272a4">::</span>COL<span style="color:#999999">)</span><span style="color:#6272a4">/</span><span style="color:#999999">(</span><span style="color:#f1fa8c">2.0</span><span style="color:#6272a4">*</span>delta<span style="color:#6272a4">*</span>delta<span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">return</span> e<span style="color:#999999">;</span>
<span style="color:#999999">}</span>
<span style="color:#ff79c6">int</span> <span style="color:#8be9fd">main</span><span style="color:#999999">(</span><span style="color:#999999">)</span>
<span style="color:#999999">{</span>
Eigen<span style="color:#6272a4">::</span>Matrix2Xd X_mat <span style="color:#6272a4">=</span> Eigen<span style="color:#6272a4">::</span>Matrix2Xd<span style="color:#6272a4">::</span><span style="color:#8be9fd">Random</span><span style="color:#999999">(</span>M<span style="color:#999999">,</span> N<span style="color:#999999">)</span><span style="color:#999999">;</span>
Eigen<span style="color:#6272a4">::</span>Vector2d x <span style="color:#6272a4">=</span> Eigen<span style="color:#6272a4">::</span>Vector2d<span style="color:#6272a4">::</span><span style="color:#8be9fd">Random</span><span style="color:#999999">(</span>M<span style="color:#999999">,</span> <span style="color:#f1fa8c">1</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">struct</span> timeb startTime<span style="color:#999999">,</span> endTime<span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout<span style="color:#6272a4"><<</span><span style="color:#f1fa8c">"test the time cost for Eigen with matrix"</span><span style="color:#6272a4"><<</span>std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>startTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">for</span> <span style="color:#999999">(</span>size_t i <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">0</span><span style="color:#999999">;</span> i <span style="color:#6272a4"><</span> <span style="color:#f1fa8c">10000</span><span style="color:#999999">;</span> i<span style="color:#6272a4">++</span><span style="color:#999999">)</span>
<span style="color:#999999">{</span>
<span style="color:#ff79c6">auto</span> phi2 <span style="color:#6272a4">=</span> <span style="color:#8be9fd">construct_Phi2eigen</span><span style="color:#999999">(</span>x<span style="color:#999999">,</span> X_mat<span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>endTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"time cost is:"</span> <span style="color:#6272a4"><<</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>time<span style="color:#6272a4">-</span>startTime<span style="color:#999999">.</span>time<span style="color:#999999">)</span><span style="color:#6272a4">*</span><span style="color:#f1fa8c">1000</span> <span style="color:#6272a4">+</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>millitm <span style="color:#6272a4">-</span> startTime<span style="color:#999999">.</span>millitm<span style="color:#999999">)</span> <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"ms"</span> <span style="color:#6272a4"><<</span> std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span> D_arr <span style="color:#6272a4">=</span> nc<span style="color:#6272a4">::</span>random<span style="color:#6272a4">::</span>rand<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span><span style="color:#999999">(</span><span style="color:#999999">{</span>N<span style="color:#999999">,</span> M<span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span> x1 <span style="color:#6272a4">=</span> nc<span style="color:#6272a4">::</span>random<span style="color:#6272a4">::</span>rand<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span><span style="color:#999999">(</span><span style="color:#999999">{</span><span style="color:#f1fa8c">1</span><span style="color:#999999">,</span> M<span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout<span style="color:#6272a4"><<</span><span style="color:#f1fa8c">"test the time cost for numcpp"</span><span style="color:#6272a4"><<</span>std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>startTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">for</span> <span style="color:#999999">(</span>size_t i <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">0</span><span style="color:#999999">;</span> i <span style="color:#6272a4"><</span> <span style="color:#f1fa8c">10000</span><span style="color:#999999">;</span> i<span style="color:#6272a4">++</span><span style="color:#999999">)</span>
<span style="color:#999999">{</span>
<span style="color:#ff79c6">auto</span> phi3 <span style="color:#6272a4">=</span> <span style="color:#8be9fd">contruct_Phi2numcpp</span><span style="color:#999999">(</span>x1<span style="color:#999999">,</span> D_arr<span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#6272a4">// std::cout<<phi3<<std::endl;</span>
<span style="color:#999999">}</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>endTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"time cost is:"</span> <span style="color:#6272a4"><<</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>time<span style="color:#6272a4">-</span>startTime<span style="color:#999999">.</span>time<span style="color:#999999">)</span><span style="color:#6272a4">*</span><span style="color:#f1fa8c">1000</span> <span style="color:#6272a4">+</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>millitm <span style="color:#6272a4">-</span> startTime<span style="color:#999999">.</span>millitm<span style="color:#999999">)</span> <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"ms"</span> <span style="color:#6272a4"><<</span> std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
<span style="color:#999999">}</span>
</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- float型
<span style="color:#000000"><code class="language-cpp"><span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><iostream></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><vector></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><fstream></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><cmath></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><sys/timeb.h></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span><span style="color:#f1fa8c">"iomanip"</span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><Eigen/Dense></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span><span style="color:#f1fa8c">"NumCpp.hpp"</span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span><span style="color:#f1fa8c">"boost/filesystem.hpp"</span></span>
<span style="color:#ff79c6">using</span> <span style="color:#ff79c6">namespace</span> Eigen<span style="color:#999999">;</span>
<span style="color:#ff79c6">using</span> <span style="color:#ff79c6">namespace</span> std<span style="color:#999999">;</span>
<span style="color:#ff79c6">int</span> M <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">2</span><span style="color:#999999">;</span> <span style="color:#6272a4">// 2 20 200</span>
<span style="color:#ff79c6">int</span> N <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">2</span><span style="color:#999999">;</span> <span style="color:#6272a4">// 2 20 200</span>
Eigen<span style="color:#6272a4">::</span>RowVectorXf <span style="color:#8be9fd">construct_Phi2eigen</span><span style="color:#999999">(</span>Eigen<span style="color:#6272a4">::</span>VectorXf x<span style="color:#999999">,</span> Eigen<span style="color:#6272a4">::</span>MatrixXf ALD_mat<span style="color:#999999">)</span>
<span style="color:#999999">{</span>
<span style="color:#ff79c6">float</span> delta <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">1.2</span><span style="color:#999999">;</span>
Eigen<span style="color:#6272a4">::</span>MatrixXf dmat <span style="color:#6272a4">=</span> ALD_mat<span style="color:#999999">.</span><span style="color:#8be9fd">colwise</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#6272a4">-</span> x<span style="color:#999999">;</span>
Eigen<span style="color:#6272a4">::</span>MatrixXf dmat2 <span style="color:#6272a4">=</span> dmat<span style="color:#999999">.</span><span style="color:#8be9fd">array</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">.</span><span style="color:#8be9fd">pow</span><span style="color:#999999">(</span><span style="color:#f1fa8c">2</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
Eigen<span style="color:#6272a4">::</span>RowVectorXf dmat2sum <span style="color:#6272a4">=</span> <span style="color:#6272a4">-</span>dmat2<span style="color:#999999">.</span><span style="color:#8be9fd">colwise</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">.</span><span style="color:#8be9fd">sum</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#6272a4">/</span><span style="color:#999999">(</span><span style="color:#f1fa8c">2.0f</span><span style="color:#6272a4">*</span>delta<span style="color:#6272a4">*</span>delta<span style="color:#999999">)</span><span style="color:#999999">;</span>
Eigen<span style="color:#6272a4">::</span>RowVectorXf y <span style="color:#6272a4">=</span> dmat2sum<span style="color:#999999">.</span><span style="color:#8be9fd">array</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">.</span><span style="color:#8be9fd">exp</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">return</span> y<span style="color:#999999">;</span>
<span style="color:#999999">}</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span> <span style="color:#8be9fd">contruct_Phi2numcpp</span><span style="color:#999999">(</span>nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span> x<span style="color:#999999">,</span> nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span> ALD_buf<span style="color:#999999">)</span>
<span style="color:#999999">{</span>
<span style="color:#ff79c6">float</span> delta <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">1.2</span><span style="color:#999999">;</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span> c <span style="color:#6272a4">=</span> ALD_buf <span style="color:#6272a4">-</span> nc<span style="color:#6272a4">::</span><span style="color:#8be9fd">tile</span><span style="color:#999999">(</span>x<span style="color:#999999">,</span> <span style="color:#999999">{</span>ALD_buf<span style="color:#999999">.</span><span style="color:#8be9fd">shape</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">.</span>rows <span style="color:#999999">,</span> <span style="color:#f1fa8c">1</span><span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span> e <span style="color:#6272a4">=</span> nc<span style="color:#6272a4">::</span><span style="color:#8be9fd">exp</span><span style="color:#999999">(</span><span style="color:#6272a4">-</span>nc<span style="color:#6272a4">::</span><span style="color:#8be9fd">sum</span><span style="color:#999999">(</span>nc<span style="color:#6272a4">::</span><span style="color:#8be9fd">power</span><span style="color:#999999">(</span>c<span style="color:#999999">,</span> <span style="color:#f1fa8c">2</span><span style="color:#999999">)</span><span style="color:#999999">,</span> nc<span style="color:#6272a4">::</span>Axis<span style="color:#6272a4">::</span>COL<span style="color:#999999">)</span><span style="color:#6272a4">/</span><span style="color:#999999">(</span><span style="color:#f1fa8c">2.0f</span><span style="color:#6272a4">*</span>delta<span style="color:#6272a4">*</span>delta<span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">return</span> e<span style="color:#999999">;</span>
<span style="color:#999999">}</span>
<span style="color:#ff79c6">int</span> <span style="color:#8be9fd">main</span><span style="color:#999999">(</span><span style="color:#999999">)</span>
<span style="color:#999999">{</span>
Eigen<span style="color:#6272a4">::</span>MatrixXf X_mat <span style="color:#6272a4">=</span> Eigen<span style="color:#6272a4">::</span>MatrixXf<span style="color:#6272a4">::</span><span style="color:#8be9fd">Random</span><span style="color:#999999">(</span>M<span style="color:#999999">,</span> N<span style="color:#999999">)</span><span style="color:#999999">;</span>
Eigen<span style="color:#6272a4">::</span>VectorXf x <span style="color:#6272a4">=</span> Eigen<span style="color:#6272a4">::</span>VectorXf<span style="color:#6272a4">::</span><span style="color:#8be9fd">Random</span><span style="color:#999999">(</span>M<span style="color:#999999">,</span> <span style="color:#f1fa8c">1</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">struct</span> timeb startTime<span style="color:#999999">,</span> endTime<span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout<span style="color:#6272a4"><<</span><span style="color:#f1fa8c">"test the time cost for Eigen with matrix"</span><span style="color:#6272a4"><<</span>std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>startTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">for</span> <span style="color:#999999">(</span>size_t i <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">0</span><span style="color:#999999">;</span> i <span style="color:#6272a4"><</span> <span style="color:#f1fa8c">10000</span><span style="color:#999999">;</span> i<span style="color:#6272a4">++</span><span style="color:#999999">)</span>
<span style="color:#999999">{</span>
<span style="color:#ff79c6">auto</span> phi2 <span style="color:#6272a4">=</span> <span style="color:#8be9fd">construct_Phi2eigen</span><span style="color:#999999">(</span>x<span style="color:#999999">,</span> X_mat<span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>endTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"time cost is:"</span> <span style="color:#6272a4"><<</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>time<span style="color:#6272a4">-</span>startTime<span style="color:#999999">.</span>time<span style="color:#999999">)</span><span style="color:#6272a4">*</span><span style="color:#f1fa8c">1000</span> <span style="color:#6272a4">+</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>millitm <span style="color:#6272a4">-</span> startTime<span style="color:#999999">.</span>millitm<span style="color:#999999">)</span> <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"ms"</span> <span style="color:#6272a4"><<</span> std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span> x1 <span style="color:#6272a4">=</span> nc<span style="color:#6272a4">::</span>random<span style="color:#6272a4">::</span>rand<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span><span style="color:#999999">(</span><span style="color:#999999">{</span><span style="color:#f1fa8c">1</span><span style="color:#999999">,</span> M<span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span> D_arr <span style="color:#6272a4">=</span> nc<span style="color:#6272a4">::</span>random<span style="color:#6272a4">::</span>rand<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span><span style="color:#999999">(</span><span style="color:#999999">{</span>N<span style="color:#999999">,</span> M<span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout<span style="color:#6272a4"><<</span><span style="color:#f1fa8c">"test the time cost for numcpp"</span><span style="color:#6272a4"><<</span>std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>startTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">for</span> <span style="color:#999999">(</span>size_t i <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">0</span><span style="color:#999999">;</span> i <span style="color:#6272a4"><</span> <span style="color:#f1fa8c">10000</span><span style="color:#999999">;</span> i<span style="color:#6272a4">++</span><span style="color:#999999">)</span>
<span style="color:#999999">{</span>
<span style="color:#ff79c6">auto</span> phi3 <span style="color:#6272a4">=</span> <span style="color:#8be9fd">contruct_Phi2numcpp</span><span style="color:#999999">(</span>x1<span style="color:#999999">,</span> D_arr<span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#6272a4">// std::cout<<phi3<<std::endl;</span>
<span style="color:#999999">}</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>endTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"time cost is:"</span> <span style="color:#6272a4"><<</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>time<span style="color:#6272a4">-</span>startTime<span style="color:#999999">.</span>time<span style="color:#999999">)</span><span style="color:#6272a4">*</span><span style="color:#f1fa8c">1000</span> <span style="color:#6272a4">+</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>millitm <span style="color:#6272a4">-</span> startTime<span style="color:#999999">.</span>millitm<span style="color:#999999">)</span> <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"ms"</span> <span style="color:#6272a4"><<</span> std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
<span style="color:#999999">}</span>
</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- python for numpy and cupy
<span style="color:#000000"><code class="language-python"><span style="color:#ff79c6">import</span> cupy <span style="color:#ff79c6">as</span> cp
<span style="color:#ff79c6">import</span> numpy <span style="color:#ff79c6">as</span> np
<span style="color:#ff79c6">import</span> time
delta <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">1.2</span>
M <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">2</span> <span style="color:#6272a4"># 2 20 200</span>
N <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">2</span> <span style="color:#6272a4"># 2 20 200</span>
x_cp <span style="color:#6272a4">=</span> cp<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span><span style="color:#f1fa8c">1</span><span style="color:#999999">,</span>M<span style="color:#999999">)</span>
D_arr_cp <span style="color:#6272a4">=</span> cp<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span>N<span style="color:#999999">,</span> M<span style="color:#999999">)</span>
x_np <span style="color:#6272a4">=</span> np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span><span style="color:#f1fa8c">1</span><span style="color:#999999">,</span>M<span style="color:#999999">)</span>
D_arr_np <span style="color:#6272a4">=</span> np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span>N<span style="color:#999999">,</span> M<span style="color:#999999">)</span>
<span style="color:#ff79c6">def</span> <span style="color:#8be9fd">construct_Phi2_cp</span><span style="color:#999999">(</span>x<span style="color:#999999">,</span> ALD_buf<span style="color:#999999">)</span><span style="color:#999999">:</span>
ALD_arr <span style="color:#6272a4">=</span> cp<span style="color:#999999">.</span>array<span style="color:#999999">(</span>ALD_buf<span style="color:#999999">)</span>
x <span style="color:#6272a4">=</span> cp<span style="color:#999999">.</span>tile<span style="color:#999999">(</span>x<span style="color:#999999">,</span> <span style="color:#999999">(</span><span style="color:#f1fa8c">len</span><span style="color:#999999">(</span>ALD_buf<span style="color:#999999">)</span><span style="color:#999999">,</span> <span style="color:#f1fa8c">1</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
dX <span style="color:#6272a4">=</span> ALD_arr <span style="color:#6272a4">-</span> x
<span style="color:#ff79c6">return</span> cp<span style="color:#999999">.</span>exp<span style="color:#999999">(</span><span style="color:#6272a4">-</span>cp<span style="color:#999999">.</span><span style="color:#f1fa8c">sum</span><span style="color:#999999">(</span>cp<span style="color:#999999">.</span>power<span style="color:#999999">(</span>dX<span style="color:#999999">,</span> <span style="color:#f1fa8c">2</span><span style="color:#999999">)</span><span style="color:#999999">,</span> axis<span style="color:#6272a4">=</span><span style="color:#f1fa8c">1</span><span style="color:#999999">)</span><span style="color:#6272a4">/</span><span style="color:#f1fa8c">2</span><span style="color:#6272a4">*</span>delta<span style="color:#6272a4">*</span>delta<span style="color:#999999">)</span>
<span style="color:#ff79c6">def</span> <span style="color:#8be9fd">construct_Phi2_np</span><span style="color:#999999">(</span>x<span style="color:#999999">,</span> ALD_buf<span style="color:#999999">)</span><span style="color:#999999">:</span>
ALD_arr <span style="color:#6272a4">=</span> np<span style="color:#999999">.</span>array<span style="color:#999999">(</span>ALD_buf<span style="color:#999999">)</span>
x <span style="color:#6272a4">=</span> np<span style="color:#999999">.</span>tile<span style="color:#999999">(</span>x<span style="color:#999999">,</span> <span style="color:#999999">(</span><span style="color:#f1fa8c">len</span><span style="color:#999999">(</span>ALD_buf<span style="color:#999999">)</span><span style="color:#999999">,</span> <span style="color:#f1fa8c">1</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
dX <span style="color:#6272a4">=</span> ALD_arr <span style="color:#6272a4">-</span> x
<span style="color:#ff79c6">return</span> np<span style="color:#999999">.</span>exp<span style="color:#999999">(</span><span style="color:#6272a4">-</span>np<span style="color:#999999">.</span><span style="color:#f1fa8c">sum</span><span style="color:#999999">(</span>np<span style="color:#999999">.</span>power<span style="color:#999999">(</span>dX<span style="color:#999999">,</span> <span style="color:#f1fa8c">2</span><span style="color:#999999">)</span><span style="color:#999999">,</span> axis<span style="color:#6272a4">=</span><span style="color:#f1fa8c">1</span><span style="color:#999999">)</span><span style="color:#6272a4">/</span><span style="color:#f1fa8c">2</span><span style="color:#6272a4">*</span>delta<span style="color:#6272a4">*</span>delta<span style="color:#999999">)</span>
<span style="color:#ff79c6">def</span> <span style="color:#8be9fd">testtimecp</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">:</span>
<span style="color:#ff79c6">for</span> i <span style="color:#ff79c6">in</span> <span style="color:#f1fa8c">range</span><span style="color:#999999">(</span><span style="color:#f1fa8c">1000</span><span style="color:#999999">)</span><span style="color:#999999">:</span>
construct_Phi2_cp<span style="color:#999999">(</span>x_cp<span style="color:#999999">,</span> D_arr_cp<span style="color:#999999">)</span>
<span style="color:#ff79c6">def</span> <span style="color:#8be9fd">testtimenp</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">:</span>
<span style="color:#ff79c6">for</span> i <span style="color:#ff79c6">in</span> <span style="color:#f1fa8c">range</span><span style="color:#999999">(</span><span style="color:#f1fa8c">1000</span><span style="color:#999999">)</span><span style="color:#999999">:</span>
construct_Phi2_np<span style="color:#999999">(</span>x_np<span style="color:#999999">,</span> D_arr_np<span style="color:#999999">)</span>
<span style="color:#ff79c6">print</span><span style="color:#999999">(</span><span style="color:#f1fa8c">"time cost for cupy:"</span><span style="color:#999999">)</span>
<span style="color:#6272a4">%</span>time testtimecp<span style="color:#999999">(</span><span style="color:#999999">)</span>
<span style="color:#ff79c6">print</span><span style="color:#999999">(</span><span style="color:#f1fa8c">"time cost for numpy"</span><span style="color:#999999">)</span>
<span style="color:#6272a4">%</span>time testtimenp<span style="color:#999999">(</span><span style="color:#999999">)</span>
</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
2.3、测试结果
矩阵大小 | M=2, N=2 | M=20, N=20 | M=200, N=200 | M=200, N=400 | M=400, N=200 |
---|---|---|---|---|---|
Eigen | f(6ms)、d(6ms) | f(22ms)、d(30ms) | f(685ms)、d(2.283s) | f(2.222s)、d(4.845s)) | f(1.567s)、d(4.843s) |
NumCpp | f(10ms)、d(11ms) | f(38ms)、d(32ms) | f(1.51s)、d(1.854) | f(3.035s)、d(3.619s) | f(3.255s)、d(7.278s) |
NumPy | 195ms | 234ms | 3.25s | 6.32s | 6.32s |
CuPy | 1.83s | 1.75s | 1.75s | 1.71s | 1.81s |
三、动态矩阵计算测试
3.1 测试程序
- float cpp
<span style="color:#000000"><code class="language-cpp"><span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><iostream></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><vector></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><fstream></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><cmath></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><sys/timeb.h></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span><span style="color:#f1fa8c">"iomanip"</span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><Eigen/Dense></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span><span style="color:#f1fa8c">"NumCpp.hpp"</span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span><span style="color:#f1fa8c">"boost/filesystem.hpp"</span></span>
<span style="color:#ff79c6">using</span> <span style="color:#ff79c6">namespace</span> Eigen<span style="color:#999999">;</span>
<span style="color:#ff79c6">using</span> <span style="color:#ff79c6">namespace</span> std<span style="color:#999999">;</span>
<span style="color:#ff79c6">int</span> M <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">200</span><span style="color:#999999">;</span> <span style="color:#6272a4">// 2 20 200</span>
<span style="color:#ff79c6">int</span> N <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">200</span><span style="color:#999999">;</span> <span style="color:#6272a4">// 2 20 200</span>
<span style="color:#ff79c6">int</span> <span style="color:#8be9fd">main</span><span style="color:#999999">(</span><span style="color:#999999">)</span>
<span style="color:#999999">{</span>
Eigen<span style="color:#6272a4">::</span>Matrix2Xf X_mat <span style="color:#6272a4">=</span> Eigen<span style="color:#6272a4">::</span>Matrix2Xf<span style="color:#6272a4">::</span><span style="color:#8be9fd">Random</span><span style="color:#999999">(</span>M<span style="color:#999999">,</span> N<span style="color:#999999">)</span><span style="color:#999999">;</span>
Eigen<span style="color:#6272a4">::</span>Vector2f x <span style="color:#6272a4">=</span> Eigen<span style="color:#6272a4">::</span>Vector2f<span style="color:#6272a4">::</span><span style="color:#8be9fd">Random</span><span style="color:#999999">(</span>M<span style="color:#999999">,</span> <span style="color:#f1fa8c">1</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout<span style="color:#6272a4"><<</span><span style="color:#f1fa8c">"test the time cost for Eigen with matrix"</span><span style="color:#6272a4"><<</span>std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
<span style="color:#ff79c6">struct</span> timeb startTime<span style="color:#999999">,</span> endTime<span style="color:#999999">;</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>startTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">for</span> <span style="color:#999999">(</span>size_t i <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">0</span><span style="color:#999999">;</span> i <span style="color:#6272a4"><</span> <span style="color:#f1fa8c">10000</span><span style="color:#999999">;</span> i<span style="color:#6272a4">++</span><span style="color:#999999">)</span>
<span style="color:#999999">{</span>
X_mat <span style="color:#6272a4">=</span> <span style="color:#999999">(</span>Eigen<span style="color:#6272a4">::</span><span style="color:#8be9fd">MatrixXf</span><span style="color:#999999">(</span>X_mat<span style="color:#999999">.</span><span style="color:#8be9fd">rows</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">,</span> X_mat<span style="color:#999999">.</span><span style="color:#8be9fd">cols</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#6272a4">+</span>x<span style="color:#999999">.</span><span style="color:#8be9fd">cols</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#6272a4"><<</span>X_mat<span style="color:#999999">,</span> x<span style="color:#999999">)</span><span style="color:#999999">.</span><span style="color:#8be9fd">finished</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>endTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"time cost is:"</span> <span style="color:#6272a4"><<</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>time<span style="color:#6272a4">-</span>startTime<span style="color:#999999">.</span>time<span style="color:#999999">)</span><span style="color:#6272a4">*</span><span style="color:#f1fa8c">1000</span> <span style="color:#6272a4">+</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>millitm <span style="color:#6272a4">-</span> startTime<span style="color:#999999">.</span>millitm<span style="color:#999999">)</span> <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"ms"</span> <span style="color:#6272a4"><<</span> std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span> x1 <span style="color:#6272a4">=</span> nc<span style="color:#6272a4">::</span>random<span style="color:#6272a4">::</span>rand<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span><span style="color:#999999">(</span><span style="color:#999999">{</span>M<span style="color:#999999">,</span> <span style="color:#f1fa8c">1</span><span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span> D_arr <span style="color:#6272a4">=</span> nc<span style="color:#6272a4">::</span>random<span style="color:#6272a4">::</span>rand<span style="color:#6272a4"><</span><span style="color:#ff79c6">float</span><span style="color:#6272a4">></span><span style="color:#999999">(</span><span style="color:#999999">{</span>M<span style="color:#999999">,</span> N<span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout<span style="color:#6272a4"><<</span><span style="color:#f1fa8c">"test the time cost for numcpp"</span><span style="color:#6272a4"><<</span>std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>startTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">for</span> <span style="color:#999999">(</span>size_t i <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">0</span><span style="color:#999999">;</span> i <span style="color:#6272a4"><</span> <span style="color:#f1fa8c">10000</span><span style="color:#999999">;</span> i<span style="color:#6272a4">++</span><span style="color:#999999">)</span>
<span style="color:#999999">{</span>
D_arr <span style="color:#6272a4">=</span> nc<span style="color:#6272a4">::</span><span style="color:#8be9fd">column_stack</span><span style="color:#999999">(</span><span style="color:#999999">{</span>D_arr<span style="color:#999999">,</span> x1<span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#6272a4">// std::cout<<phi3<<std::endl;</span>
<span style="color:#999999">}</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>endTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"time cost is:"</span> <span style="color:#6272a4"><<</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>time<span style="color:#6272a4">-</span>startTime<span style="color:#999999">.</span>time<span style="color:#999999">)</span><span style="color:#6272a4">*</span><span style="color:#f1fa8c">1000</span> <span style="color:#6272a4">+</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>millitm <span style="color:#6272a4">-</span> startTime<span style="color:#999999">.</span>millitm<span style="color:#999999">)</span> <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"ms"</span> <span style="color:#6272a4"><<</span> std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
<span style="color:#999999">}</span>
</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- double cpp
<span style="color:#000000"><code class="language-cpp"><span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><iostream></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><vector></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><fstream></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><cmath></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><sys/timeb.h></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span><span style="color:#f1fa8c">"iomanip"</span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span> <span style="color:#f1fa8c"><Eigen/Dense></span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span><span style="color:#f1fa8c">"NumCpp.hpp"</span></span>
<span style="color:#f1fa8c">#<span style="color:#ff79c6">include</span><span style="color:#f1fa8c">"boost/filesystem.hpp"</span></span>
<span style="color:#ff79c6">using</span> <span style="color:#ff79c6">namespace</span> Eigen<span style="color:#999999">;</span>
<span style="color:#ff79c6">using</span> <span style="color:#ff79c6">namespace</span> std<span style="color:#999999">;</span>
<span style="color:#ff79c6">int</span> M <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">200</span><span style="color:#999999">;</span> <span style="color:#6272a4">// 2 20 200</span>
<span style="color:#ff79c6">int</span> N <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">200</span><span style="color:#999999">;</span> <span style="color:#6272a4">// 2 20 200</span>
<span style="color:#ff79c6">int</span> <span style="color:#8be9fd">main</span><span style="color:#999999">(</span><span style="color:#999999">)</span>
<span style="color:#999999">{</span>
Eigen<span style="color:#6272a4">::</span>MatrixXd X_mat <span style="color:#6272a4">=</span> Eigen<span style="color:#6272a4">::</span>MatrixXd<span style="color:#6272a4">::</span><span style="color:#8be9fd">Random</span><span style="color:#999999">(</span>M<span style="color:#999999">,</span> N<span style="color:#999999">)</span><span style="color:#999999">;</span>
Eigen<span style="color:#6272a4">::</span>MatrixXd x <span style="color:#6272a4">=</span> Eigen<span style="color:#6272a4">::</span>VectorXd<span style="color:#6272a4">::</span><span style="color:#8be9fd">Random</span><span style="color:#999999">(</span>M<span style="color:#999999">,</span> <span style="color:#f1fa8c">1</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout<span style="color:#6272a4"><<</span><span style="color:#f1fa8c">"test the time cost for Eigen with matrix"</span><span style="color:#6272a4"><<</span>std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
<span style="color:#ff79c6">struct</span> timeb startTime<span style="color:#999999">,</span> endTime<span style="color:#999999">;</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>startTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">for</span> <span style="color:#999999">(</span>size_t i <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">0</span><span style="color:#999999">;</span> i <span style="color:#6272a4"><</span> <span style="color:#f1fa8c">10000</span><span style="color:#999999">;</span> i<span style="color:#6272a4">++</span><span style="color:#999999">)</span>
<span style="color:#999999">{</span>
X_mat <span style="color:#6272a4">=</span> <span style="color:#999999">(</span>Eigen<span style="color:#6272a4">::</span><span style="color:#8be9fd">MatrixXd</span><span style="color:#999999">(</span>X_mat<span style="color:#999999">.</span><span style="color:#8be9fd">rows</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">,</span> X_mat<span style="color:#999999">.</span><span style="color:#8be9fd">cols</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#6272a4">+</span>x<span style="color:#999999">.</span><span style="color:#8be9fd">cols</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#6272a4"><<</span>X_mat<span style="color:#999999">,</span> x<span style="color:#999999">)</span><span style="color:#999999">.</span><span style="color:#8be9fd">finished</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>endTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"time cost is:"</span> <span style="color:#6272a4"><<</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>time<span style="color:#6272a4">-</span>startTime<span style="color:#999999">.</span>time<span style="color:#999999">)</span><span style="color:#6272a4">*</span><span style="color:#f1fa8c">1000</span> <span style="color:#6272a4">+</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>millitm <span style="color:#6272a4">-</span> startTime<span style="color:#999999">.</span>millitm<span style="color:#999999">)</span> <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"ms"</span> <span style="color:#6272a4"><<</span> std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span> x1 <span style="color:#6272a4">=</span> nc<span style="color:#6272a4">::</span>random<span style="color:#6272a4">::</span>rand<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span><span style="color:#999999">(</span><span style="color:#999999">{</span>M<span style="color:#999999">,</span> <span style="color:#f1fa8c">1</span><span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
nc<span style="color:#6272a4">::</span>NdArray<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span> D_arr <span style="color:#6272a4">=</span> nc<span style="color:#6272a4">::</span>random<span style="color:#6272a4">::</span>rand<span style="color:#6272a4"><</span><span style="color:#ff79c6">double</span><span style="color:#6272a4">></span><span style="color:#999999">(</span><span style="color:#999999">{</span>M<span style="color:#999999">,</span> N<span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout<span style="color:#6272a4"><<</span><span style="color:#f1fa8c">"test the time cost for numcpp"</span><span style="color:#6272a4"><<</span>std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>startTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#ff79c6">for</span> <span style="color:#999999">(</span>size_t i <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">0</span><span style="color:#999999">;</span> i <span style="color:#6272a4"><</span> <span style="color:#f1fa8c">10000</span><span style="color:#999999">;</span> i<span style="color:#6272a4">++</span><span style="color:#999999">)</span>
<span style="color:#999999">{</span>
D_arr <span style="color:#6272a4">=</span> nc<span style="color:#6272a4">::</span><span style="color:#8be9fd">column_stack</span><span style="color:#999999">(</span><span style="color:#999999">{</span>D_arr<span style="color:#999999">,</span> x1<span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#6272a4">// std::cout<<phi3<<std::endl;</span>
<span style="color:#999999">}</span>
<span style="color:#8be9fd">ftime</span><span style="color:#999999">(</span><span style="color:#6272a4">&</span>endTime<span style="color:#999999">)</span><span style="color:#999999">;</span>
std<span style="color:#6272a4">::</span>cout <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"time cost is:"</span> <span style="color:#6272a4"><<</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>time<span style="color:#6272a4">-</span>startTime<span style="color:#999999">.</span>time<span style="color:#999999">)</span><span style="color:#6272a4">*</span><span style="color:#f1fa8c">1000</span> <span style="color:#6272a4">+</span> <span style="color:#999999">(</span>endTime<span style="color:#999999">.</span>millitm <span style="color:#6272a4">-</span> startTime<span style="color:#999999">.</span>millitm<span style="color:#999999">)</span> <span style="color:#6272a4"><<</span> <span style="color:#f1fa8c">"ms"</span> <span style="color:#6272a4"><<</span> std<span style="color:#6272a4">::</span>endl<span style="color:#999999">;</span>
<span style="color:#999999">}</span>
</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- python for numpy and cupy
<span style="color:#000000"><code class="language-python"><span style="color:#ff79c6">import</span> cupy <span style="color:#ff79c6">as</span> cp
<span style="color:#ff79c6">import</span> numpy <span style="color:#ff79c6">as</span> np
<span style="color:#ff79c6">import</span> time
M <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">2</span> <span style="color:#6272a4"># 2 20 200</span>
N <span style="color:#6272a4">=</span> <span style="color:#f1fa8c">2</span> <span style="color:#6272a4"># 2 20 200</span>
x1_np <span style="color:#6272a4">=</span> np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span>M<span style="color:#999999">,</span> <span style="color:#f1fa8c">1</span><span style="color:#999999">)</span>
D_arr_np <span style="color:#6272a4">=</span> np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span>M<span style="color:#999999">,</span> N<span style="color:#999999">)</span>
x1_cp <span style="color:#6272a4">=</span> cp<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span>M<span style="color:#999999">,</span> <span style="color:#f1fa8c">1</span><span style="color:#999999">)</span>
D_arr_cp <span style="color:#6272a4">=</span> cp<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span>M<span style="color:#999999">,</span> N<span style="color:#999999">)</span>
<span style="color:#ff79c6">def</span> <span style="color:#8be9fd">testtimecp</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">:</span>
<span style="color:#ff79c6">global</span> D_arr_cp
<span style="color:#ff79c6">for</span> i <span style="color:#ff79c6">in</span> <span style="color:#f1fa8c">range</span><span style="color:#999999">(</span><span style="color:#f1fa8c">10000</span><span style="color:#999999">)</span><span style="color:#999999">:</span>
D_arr_cp <span style="color:#6272a4">=</span> cp<span style="color:#999999">.</span>column_stack<span style="color:#999999">(</span><span style="color:#999999">(</span>D_arr_cp<span style="color:#999999">,</span> x1_cp<span style="color:#999999">)</span><span style="color:#999999">)</span>
<span style="color:#ff79c6">def</span> <span style="color:#8be9fd">testtimenp</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">:</span>
<span style="color:#ff79c6">global</span> D_arr_np
<span style="color:#ff79c6">for</span> i <span style="color:#ff79c6">in</span> <span style="color:#f1fa8c">range</span><span style="color:#999999">(</span><span style="color:#f1fa8c">10000</span><span style="color:#999999">)</span><span style="color:#999999">:</span>
D_arr_np <span style="color:#6272a4">=</span> np<span style="color:#999999">.</span>column_stack<span style="color:#999999">(</span><span style="color:#999999">(</span>D_arr_np<span style="color:#999999">,</span> x1_np<span style="color:#999999">)</span><span style="color:#999999">)</span>
<span style="color:#ff79c6">print</span><span style="color:#999999">(</span><span style="color:#f1fa8c">"time cost for cupy:"</span><span style="color:#999999">)</span>
<span style="color:#6272a4">%</span>time testtimecp<span style="color:#999999">(</span><span style="color:#999999">)</span>
<span style="color:#ff79c6">print</span><span style="color:#999999">(</span><span style="color:#f1fa8c">"time cost for numpy"</span><span style="color:#999999">)</span>
<span style="color:#6272a4">%</span>time testtimenp<span style="color:#999999">(</span><span style="color:#999999">)</span>
</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
3.2 测试结果
矩阵大小 | M=2, N=2 | M=20, N=20 | M=200, N=200 |
---|---|---|---|
Eigen | f(203ms)、d(377ms) | f(1.427s)、d(2.875s) | f(20.29s)、d(42.458s) |
NumCpp | f(130ms)、d(144ms) | f(1.416s)、d(1.319s) | f(15.673s)、d(18.797s) |
NumPy | 54ms | 324ms | 8.36s |
CuPy | 308ms | 312ms | 3.03s |
四、结论与建议
4.1 结论
- 矩阵计算效率由高到低:Eigen>NumCpp>NumPy ;
- 动态矩阵运算(此处不断增加一列)的效率由高到低:NumPy>NumCpp>Eigen;
- CuPy在数据维数较低时,没有体现出加速,但是应对高维数据时,有明显的加速;
- 一个有意思的现象,此处试验结果中数据为float型时,所需的计算成本越低。(最开始,我一直认为32位的float要比64位的double要省时,但是网上有人说:新版C++会将float转为double再处理,等于用float会增加额外的转换步骤,计算效率更低,但是本博客的试验结果又验证回最初的直觉。不知所以然,希望大神路过能给予解答。)
4.2 建议
- 当不存在大量动态矩阵扩展的算法,C++使用Eigen;
- 当数据维数很高时,强烈建议GPU加速;
- 当算法存在动态矩阵扩展时,需要通过试验确定合适的库,可能组合各种库为较合适的方案。
4.3 源起
写了一个动态RBF网络,原来一直在python语言下用,采用NumPy实现。最近需要在C++环境中使用,于是用Eigen实现了。发现,Eigen实现版本的计算成本比NumPy还高。于是又实现了NumCpp版本,发现还是NumPy效率最高。经过以上试验,终于窥见一些缘由:算法里同时需要大量矩阵乘、加、减运算,同时又有大量动态矩阵运算(增加一行或一列)。矩阵乘、加、减的运算相差较各库的动态矩阵计算效率相差小。这也是为什么会产生与直觉不一样的结果。其中,double型计算更加耗时。。。注意和下面结果相矛盾!!!
最终,我没用Eigen,而是采用C++调用Pyhon(也即NumPy实现)的方案。
下面列出动态RBF网络算法利用各库实现的计算成本:
方法 | Eigen | NumCpp | NumPy |
---|---|---|---|
time cost | f(2.575s)、d(1.355s) | f(12.048s)、d(5.707s) | 770ms |
其中,float型计算更加耗时。。。怎么和上面结果相矛盾!!!
注意事项
C++编译存在DeBug与Release两种方式,DeBug一般用于调试,编译的版本会存储大量调试信息,实际运行时并不能反应算法的真实计算成本。一定要利用Release方式编译测试代码。
这里要感谢同事小张的提醒。最初测试时,发现Eigen和NumCpp的效率都要比NumPy要差。今天午饭时跟小张抱怨这个疑惑时,小张便给出问题的所在。
在CMakeLists.txt文件里添加下面两行,启动Release编译方式,并启动最高效率编译模式。