Eigen、NumCpp、NumPy、CuPy运行时间对比

对于矩阵运算,著名的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}xRM×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−∣∣xdi​∣∣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=2M=20, N=20M=200, N=200M=200, N=400M=400, N=200
Eigenf(6ms)、d(6ms)f(22ms)、d(30ms)f(685ms)、d(2.283s)f(2.222s)、d(4.845s))f(1.567s)、d(4.843s)
NumCppf(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)
NumPy195ms234ms3.25s6.32s6.32s
CuPy1.83s1.75s1.75s1.71s1.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=2M=20, N=20M=200, N=200
Eigenf(203ms)、d(377ms)f(1.427s)、d(2.875s)f(20.29s)、d(42.458s)
NumCppf(130ms)、d(144ms)f(1.416s)、d(1.319s)f(15.673s)、d(18.797s)
NumPy54ms324ms8.36s
CuPy308ms312ms3.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网络算法利用各库实现的计算成本:

方法EigenNumCppNumPy
time costf(2.575s)、d(1.355s)f(12.048s)、d(5.707s)770ms

其中,float型计算更加耗时。。。怎么和上面结果相矛盾!!!

注意事项

C++编译存在DeBug与Release两种方式,DeBug一般用于调试,编译的版本会存储大量调试信息,实际运行时并不能反应算法的真实计算成本。一定要利用Release方式编译测试代码。

这里要感谢同事小张的提醒。最初测试时,发现Eigen和NumCpp的效率都要比NumPy要差。今天午饭时跟小张抱怨这个疑惑时,小张便给出问题的所在。

在CMakeLists.txt文件里添加下面两行,启动Release编译方式,并启动最高效率编译模式。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值