TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
/ |; ]' U: C$ J1 a7 Z7 J1 b! |5 t# U
) V3 p2 J6 ?* K理了理思路,重新做了一个测试。4 D+ \' I: [: W$ \4 E
做了两个 vector 和 两个 float *, 都长 100000, i& T3 r) @6 C3 b' X$ I4 a5 }
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.2 E4 Y6 E% U+ e
; L* R! R: g2 m( N
内循环试了4种方法,6 j8 q9 k! [4 L+ _# X# @& m
1. 直接调用 vector inner_product 247s
9 m( Z R6 I; D& {' I3 T; Z2. vector 循环点乘累加 237s3 R1 r$ |" |1 l# o/ i# K3 d
3. float * 循环点乘累加 204s1 S2 N( T6 G* J0 [. p' T
4. 空循环 100000 次 202s
- R4 ` j$ i7 s3 M- F$ f5 E# f; D( i, b! g7 k# U
不做内循环 200s0 d( Q5 |3 X1 @* p% x
% f6 h+ O$ ~' R你昨天说的对,内循环本身占比是很小的,大头在其他处理。- h- e) J+ h" z% S, y, G
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 T- w; b$ p0 _* T, y
8 A5 @* ^- _% d7 K
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
4 J0 ]9 H/ V s# Z! {3 y/ m2 Z
, \ q; J( ~* g3 Y(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)2 f/ `5 R5 Z" `; M/ F
3 T8 H R* r" h# l; ^4 B7 v7 a std::vector < float > vec1(N);
; p& b6 ^: i1 c2 g std::vector < float > vec2(N);
/ t; U: h8 m6 X( F- ~ float* b1 = new float[N];
) ?, e- i" `& N1 R" N0 F* q9 R9 Z8 [ float* b2 = new float[N];
; i: N0 n% H6 p* ]$ m4 v; S( y, b8 K6 m$ y0 M2 g; B5 p2 z
for (int j = 0; j < 6000; j++)6 p7 r$ g/ l! `6 ^
{$ D0 n, i/ q( Q3 b0 z
std::generate(vec1.begin(), vec1.end(), []() {' S* o3 @( S$ n; p
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
; l% F" d. ^1 t. y });
: y* B3 P% C9 V" s& p$ u' d! B ^6 G. | W5 D" `$ O" d
std::generate(vec2.begin(), vec2.end(), []() {
6 ?+ Y. y1 I; }% n$ @! q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
/ B3 z) B2 r+ I });
* }) A5 b [" c' ~, Y* C0 k8 y
# i& E0 M3 }, m8 A( e for (size_t jj = 0; jj < vec1.size(); jj++)
Y* e* J' C7 a: t) K) ], K" Q {
; b; q0 r- W4 ~/ o1 _* H b1[jj] = vec1[jj];1 [$ H" Q: O+ t; _5 R
}0 ]2 ~0 {( D( y) ~3 J
! I. Q5 T# ] ^9 O" \- l for (size_t jj = 0; jj < vec2.size(); jj++)8 w9 E7 ~. m& N1 _4 G
{
5 E5 z- G' w- [3 Y' p: A. ? b2[jj] = vec2[jj];
$ b4 Z" P# P" e1 A+ D) @ }
* a; k. ^6 J6 D9 C; ?% C% J i1 ]( D c! u, p4 p- z4 W
//Method - 1 N=100000 247s 4 t* V$ [$ S# y. u( v* ? ?
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
: H& t2 N _5 t/ I, G# @1 B% n
6 a) r8 h3 l3 {3 m1 c" Q //Method - 2 N=100000 237s z7 o d- _1 W# _
/*
; y* B! W; B, L4 t* j0 a for (int jj = 0; jj < N ; jj++)
7 B! u7 b! H+ q+ y* t3 \& h {
, C8 O g. ~3 e0 e( @* i- o3 T M1 { fresult += vec1[jj] * vec2[jj];( }* o8 y& b/ D
}8 b0 [) i W6 o: Y3 `" m
*/! X. s) E, S0 {) g
$ e! a# p% G7 [9 Z$ e$ a
//Method - 3 N=100000 204s( z, g6 K! f, ]/ Y2 Y
/*
" ~3 U7 Q" F, b8 r0 S for (int jj = 0; jj < N; jj++)
2 U, y1 z/ [! i {& W d9 s, A: }8 C3 ]+ w! B
fresult += b1[jj] * b2[jj];- f4 G; z* r, L- \
}
# F! z1 ]7 B) W% V */8 l3 m# P0 O) h; n: y' F: t: Z
# |1 s6 S |6 d) |7 Q //Method - 4 202s
3 ~9 X6 H0 _, O8 R- Z- X b /*. e5 R3 r' Y% {2 d8 V; Y0 Y' I
for (int jj = 0; jj < N; jj++)
3 E7 O' H) Z$ `7 [ {$ ^8 \" I$ m3 d. u9 C! t1 O8 {5 D
" n e# E4 T4 K- U1 e
}
( M, H, i4 s9 w7 |2 L& H' x1 Y- K */
4 Y% V8 J# l9 E' }% H //comment out all methods, N=100000 202s ( X: D5 e- \) L
}
) N/ @$ N% a" ?. [; d( b5 r! w3 o4 D m# T) z4 |* t
delete []b1;
% A- q2 F( ]! v& g% F7 w0 D" u; D7 T delete []b2;
* o' J7 r* C" S- }3 S |
|