TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 # ?, @2 {1 h& @- R
: Y$ K, D v1 k; g+ Q% d
理了理思路,重新做了一个测试。
& t& A. _1 U: Z0 x做了两个 vector 和 两个 float *, 都长 100000$ s/ n! S/ f; L- U- \( b" g
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.+ |7 B# C- ]# V( n3 @
' j+ | a r% \* i内循环试了4种方法,! N! t% U1 Q3 ^: l# n7 h# t5 {
1. 直接调用 vector inner_product 247s ( ]& N" N/ ]# \
2. vector 循环点乘累加 237s: b; m1 |3 e0 G
3. float * 循环点乘累加 204s7 Y' x- e) j# N" Q7 g% k
4. 空循环 100000 次 202s
/ \( A+ s, g, }) F7 n9 c: W% ~0 F/ U5 {5 g
不做内循环 200s
/ x/ J0 `* q" w/ R/ P) [$ c$ G$ ~ B4 Q
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
1 Q+ w- j1 r$ s4 J另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
/ Z" I3 w/ y$ b% L" J3 @
V5 J) E6 }- c% `9 \至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( J" d5 m& W$ C* }, P1 b' c
) L v5 [! r1 F4 l' d% o) O* b(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)5 X! E% ^2 y9 z- x) o; d; g3 o+ X
5 Q. _' N$ ~# y2 C& t
std::vector < float > vec1(N);# f: O) D8 f3 b+ o
std::vector < float > vec2(N);7 C/ \+ o& Q& K$ a$ f( w& X& g$ y" a
float* b1 = new float[N];
1 Q; {1 v( l% J6 { V* Y8 L+ \ float* b2 = new float[N];( w; `8 ~+ R% Z, d
: I7 {& k0 C/ l) L for (int j = 0; j < 6000; j++)+ O$ W$ t- D! d6 w6 q) F. g
{
3 {4 h. o2 Z. n5 B" H* W6 S6 s std::generate(vec1.begin(), vec1.end(), []() {9 ?/ x$ s2 ]) N5 S9 s6 @1 `' R
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
: Y& M0 f6 q* a9 }* p- b });
6 F8 }0 M7 T+ @( {- ]* b3 f" l/ _# d2 J) b$ O6 K, _5 T" ]
std::generate(vec2.begin(), vec2.end(), []() {8 \3 R0 ~% Z; C, s6 x D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
+ W: p7 b1 W6 t% y. C! ?, _ });/ x0 C$ A- ^! K$ C
$ \+ o0 p) g+ f% s' \: u% |
for (size_t jj = 0; jj < vec1.size(); jj++); f4 K; c$ Y8 ~+ K8 V
{
. s) j5 [9 y: Y/ J" C p3 [ b1[jj] = vec1[jj];
/ a3 D1 D3 ]3 Y+ A4 E }
?$ C; M2 ~. v0 Z; S1 V. R, s2 }5 ]6 I3 V* r' D
for (size_t jj = 0; jj < vec2.size(); jj++)
8 R" _7 @! w$ [4 _ {4 M+ X7 v# P6 T a9 V
b2[jj] = vec2[jj];% ?6 e( Q; i, J n ]' i/ o
}* T2 G" H: j$ K
: d& K& t8 K9 v4 f& v //Method - 1 N=100000 247s ' g# q7 D5 t: d, C; b1 C+ d
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* i E1 P4 |- O! p4 _
* N- h8 Y; @" U$ w) }6 {! C t
//Method - 2 N=100000 237s: ?. v) } f8 t0 Z3 ^
/*
4 ]7 L: C! l) o# o for (int jj = 0; jj < N ; jj++)
5 {8 e$ Y2 U6 [* y v+ o9 t! J {: m9 c4 Z0 o7 |) G4 P/ c5 U# J
fresult += vec1[jj] * vec2[jj];0 F9 c: o- V# k1 s3 m1 o8 T
}' w$ ]. T; Y- v% U1 b* D- m, g
*/' u/ ]# y* a: \4 O9 a
3 v: [7 D3 ?+ A7 I9 I& [3 f6 {5 {' U9 S
//Method - 3 N=100000 204s
% D" W/ l) x! h6 z! n9 ] /*
+ w; m5 t1 D7 b3 W# G5 v for (int jj = 0; jj < N; jj++)# V/ w* N+ F& I$ C* O6 L
{
7 z% h# a; y; A5 h- ] fresult += b1[jj] * b2[jj];
6 \& I6 m! {* G J# R; @, V }& \/ j" |; E/ V2 l; K; @
*/9 C6 e! y9 D: s+ n, d' W! ]
' f$ x. \0 \* V7 Q //Method - 4 202s
6 z) m3 l+ _2 _0 F/ J1 x /*, M/ U$ X' g: n- y
for (int jj = 0; jj < N; jj++)
% m" ~& k) ?6 g/ c# C8 C {
* R, B* ~% ^( V& ?% x6 ?6 C& y( `6 U 7 {+ E4 \, B6 a+ S
}
+ r7 I1 m* E5 w# G6 Y */
: a* q4 u. \7 J; X) h //comment out all methods, N=100000 202s 0 F5 t# e9 P' p% h b
}1 t4 q' H6 F; Z& a* Y3 H
, \' d' @% c3 B0 H. k delete []b1;
. D: v, M! ~ z* F delete []b2; ; }8 w6 z% H& |; n. b5 n
|
|