TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 C5 |2 f8 T! N* j) m
9 `' J5 t/ g4 ~0 k理了理思路,重新做了一个测试。5 m) v7 Z+ h0 E- G
做了两个 vector 和 两个 float *, 都长 100000
- [0 H6 `, \: a" _# Z4 e外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.# b, p& c+ B( C2 A4 F/ a4 ^
2 @8 F' `8 W4 f$ g6 s+ q: I! J内循环试了4种方法,
/ u5 |3 P2 @3 m6 q5 R2 V1. 直接调用 vector inner_product 247s . X9 Y+ O& \ b: N, w5 y7 M
2. vector 循环点乘累加 237s. K" W; U3 V* Y/ x6 l
3. float * 循环点乘累加 204s
J7 \6 E; t' Q7 Z" {4. 空循环 100000 次 202s/ C, d- K9 I( H+ S( x7 m
% B3 n0 ~6 k, R0 H
不做内循环 200s0 O# C2 W5 x% S" N0 a! L, A
" e7 ~9 i0 s* B1 o2 h9 @) @
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
, ?, G& z% c) U9 k6 S5 L- `& N/ R另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
0 [8 [4 ?% A. P
( }/ u2 w+ g# h4 k& U7 |至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)4 C1 X+ {$ P$ j* I
* U, L' @' P2 Q5 T/ S- p) w(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
6 v, Q% ]) f- _" s; Q/ x3 w9 m) x6 W* Q0 o
std::vector < float > vec1(N);
8 O, U5 h" u* C6 y3 M0 L std::vector < float > vec2(N);
$ E; p7 A( K* R: I0 }! {/ ]0 ?0 t: n float* b1 = new float[N];
; a$ N7 V+ P6 |+ ^: p4 t( Y float* b2 = new float[N];
9 r4 o q# F, T. S
; R+ }& O9 g6 | for (int j = 0; j < 6000; j++)3 Y( r- k% ?% N4 w
{3 |- ~; e( z) }# |5 `$ s
std::generate(vec1.begin(), vec1.end(), []() {9 V( C" j: \: }
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
6 x" H' d: l( ]* J1 `0 N! L });
8 z3 S3 ]" R r0 l# d% d: ~
6 o" Z6 Z3 c; N4 w6 p+ }/ v# z std::generate(vec2.begin(), vec2.end(), []() {+ G) d" B& ^7 K2 m# x
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
8 R, e: j' r1 N l/ p, k });" D( p3 g7 l% H4 q" R4 v T
4 u! M3 L r: y, h
for (size_t jj = 0; jj < vec1.size(); jj++)4 r' }5 g6 k& h0 r$ {' W" u0 [
{
& B( D d2 M3 E3 a b1[jj] = vec1[jj];# ?+ z, a- r$ H3 Y8 E
}, [/ y, M8 |% E! P3 q- s6 [% B
: j# c \2 \) c- {
for (size_t jj = 0; jj < vec2.size(); jj++)
! \$ H8 l: j( D9 @ {
7 r0 F" r2 _7 u6 u9 u b2[jj] = vec2[jj];
m9 G! d- H4 p; o' Z }4 [( l4 H$ g- g y* ~6 v
1 y' ]3 b# P! E7 N //Method - 1 N=100000 247s
# C& ~# Z& G& s8 [5 L- v% i //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
3 [2 E# U0 ^2 J7 P
/ Q) j* d8 a; e5 @# u% T% Y5 x //Method - 2 N=100000 237s, g$ J0 R2 U8 m5 z7 S1 R
/*, p# R3 q. K5 v) b" Z2 z* {8 ]
for (int jj = 0; jj < N ; jj++)1 a. P8 _: i; j2 S! h: @5 }
{
( I+ k9 f! }, @ fresult += vec1[jj] * vec2[jj];5 E; y( z4 w5 B, y& H- C
}3 m8 K, z6 s% i- L% C1 ]1 K
*/& J6 r7 f3 m% D5 y' l
; X: K- F Y" f& M( D$ ?# }# f' Z
//Method - 3 N=100000 204s: @+ P+ Y$ _: A* R* B. P
/*
5 w) [- B% X6 p9 Y& T2 D7 x for (int jj = 0; jj < N; jj++): U; o! K; H2 }3 Y* `5 b) P& `
{' R, J) x. c! [& }' A: H
fresult += b1[jj] * b2[jj];, Z! O# |- a( y$ o# X* U
}
% S' ?0 @1 I% f$ _ */! J7 Q% u7 }0 X/ U
9 T* Y) E- V" G* Q. ]: ` h
//Method - 4 202s
& l' x; H! [4 Z+ f, K1 F /*
; g1 h( k/ x4 {5 d for (int jj = 0; jj < N; jj++)
8 W. \0 i! m: Y {. y# g) `; k- u( b$ B$ x
( g5 {$ D' G: q3 G% A# }
}
4 W. T# j) B6 @* a3 L! g */
& N' i! |( P- f0 `4 w8 b //comment out all methods, N=100000 202s 8 I, y9 Y! C% L
}+ a* g# D0 ?6 Y) i( g3 x% k% e
* C6 E. ^, m" _; W& k# a" T9 A delete []b1;
+ F% ` d* _. d; i delete []b2;
: C/ Z5 t. G7 Y |
|