TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* v ]5 ? r: Z
; P1 a" j3 I2 q7 L+ _: J: l8 X理了理思路,重新做了一个测试。1 g/ ~$ ^5 J- Q4 \9 ~
做了两个 vector 和 两个 float *, 都长 100000
{* v7 m; s1 g, B3 @外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
+ l9 s7 R, r& o
, Z" Z2 J6 A# W内循环试了4种方法,% f: k3 v; V, L5 G
1. 直接调用 vector inner_product 247s
0 L6 e, |$ d( Y/ Q% v; i; o2. vector 循环点乘累加 237s
2 o0 d( l2 N" f; v4 k# e8 o3. float * 循环点乘累加 204s
8 F) x" ]) {/ `' F* ^$ U, J# i/ w4. 空循环 100000 次 202s
# L+ A5 d! V R: o" o" E9 p* D
2 [% o; }: ?$ ?' q4 b8 b7 ?/ ^不做内循环 200s" k0 _- @6 p% ?% @6 z. K
. Y H; ]* s& g4 E1 j6 k0 [你昨天说的对,内循环本身占比是很小的,大头在其他处理。/ G! R- z9 {; g& T
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
7 m0 w& R& m# F0 h* J
7 w8 n2 p5 l& q4 C至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
9 j4 B( q/ p8 c j* |& s7 [
' X8 s1 @( Z; c- C4 Q(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)2 m, s! L2 i. p$ |2 E
$ h6 G( F& F! }9 _9 o5 R- C: l
std::vector < float > vec1(N);2 k3 p# O3 |/ M7 B* ~. v6 u
std::vector < float > vec2(N);
0 S( e& Z0 _7 ?$ J) T+ a% l- ? float* b1 = new float[N];& u" ~7 G3 \% \ l
float* b2 = new float[N];. `9 }4 s1 Y8 D' y" ~+ W
8 `5 T5 u: _0 l$ K9 I/ D for (int j = 0; j < 6000; j++)
! r; V2 v" h. {. W! Z0 k% g3 A3 u {9 \# ?( B& M! Z8 _. H& c( {2 P9 M
std::generate(vec1.begin(), vec1.end(), []() {
8 [) t v9 x# [* X) q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
6 S( s+ P1 b1 i7 n) L" H; J });4 c& ?1 |% n B0 \# d! C& P( G& a2 T
- @. u* K% f& Z/ G" Y& g std::generate(vec2.begin(), vec2.end(), []() {
4 Y- T" w" `) l; E return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));; x4 n) u( g0 F9 n0 o; C d E
});- f1 x2 U" v& ?
( T- u- Z" X$ g- `* g for (size_t jj = 0; jj < vec1.size(); jj++)0 B3 \& A! t- b# a& m8 v# z* n
{
8 S" `( ~. n' z+ d4 u- Q8 t b1[jj] = vec1[jj];4 y( k7 x8 i9 L* [7 K t) a
}
/ Y: ^- n: R, V9 Q2 j
% X" M; U0 |- x9 U) o! S7 w! \# b for (size_t jj = 0; jj < vec2.size(); jj++)* L- t5 X5 `1 {. y/ H. G$ j6 S
{
7 C4 b0 ]% L# ]) j b2[jj] = vec2[jj];
+ Q0 _* i4 s' s& E }7 d4 |5 u5 w7 _/ }$ A1 w6 _, D
- a1 l5 X) I1 V2 M* E //Method - 1 N=100000 247s
+ h/ @* {# Y) V2 _ G //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 u4 Q' ^# W( A9 k2 E
2 }/ H+ U* X+ `9 w, ?4 F
//Method - 2 N=100000 237s9 _6 _; [' i: H. d. a! J: j7 x* Q
/*
9 H# F9 D, d+ ` D; J! { for (int jj = 0; jj < N ; jj++)
- L' H1 P) C: e0 e# c7 X {
3 d+ V" w% i3 r; v7 x fresult += vec1[jj] * vec2[jj];& }. a! {4 `3 v8 d
}' m( d1 C& E3 N4 F
*/
+ _3 b/ M! X9 S; E+ h 7 k0 U/ _) G( f
//Method - 3 N=100000 204s
" o% a. T R2 Z8 e! Z /*
N: ?. O% \+ r for (int jj = 0; jj < N; jj++)
5 z! D' E) O& H {
i w ]0 L/ { fresult += b1[jj] * b2[jj];( z3 ~8 ?; H5 B) h
}
" A+ Z/ q2 L' e */
: L9 r% s! m) ~& @
& V$ d( {; B& l c2 \" s: r //Method - 4 202s
5 U; D) C4 l* ]) ?" b' C" Q /*0 b' r- k- y9 ` V% E. p7 W
for (int jj = 0; jj < N; jj++)
7 v/ |' x' q+ _3 R! |& z1 z {1 o) Q6 z+ X" Y; V7 s; K
; z% S7 e( ]- W4 a- ^4 N* r }
+ J4 Z, Z: A: y: h8 V; X8 N */
' @9 j# b" z+ I& H2 w$ Y //comment out all methods, N=100000 202s ( M6 I' J. m! Q0 v1 M
}! K1 V' l( n6 P7 \; R) R
9 ~% C* b* g; {/ F* F9 X& f* b3 d delete []b1;
, Q7 \9 f; W& [, e" T! t delete []b2;
, {4 F/ B0 D0 ]3 c3 U* T! T* Y |
|