TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
+ K2 P- `5 P/ {/ a, [ p) P. N
- }% r J5 F( s. W! N! x6 o理了理思路,重新做了一个测试。
4 y' U) V" Y6 o: b: B" t做了两个 vector 和 两个 float *, 都长 100000
8 ~1 l# x# G* ^! v% R2 b, Z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.; _3 }# V( G3 L- [0 T: m
: B( p. w, A3 Q内循环试了4种方法,. s8 b9 |0 p. V% o6 f, L" m
1. 直接调用 vector inner_product 247s 3 T3 | _* x+ c/ _9 V7 k3 @
2. vector 循环点乘累加 237s
+ F# p( W" u4 ]& l K7 A3. float * 循环点乘累加 204s1 |6 l7 p! R( z/ e# f4 f
4. 空循环 100000 次 202s1 b1 `: g6 F4 ^$ e, N* t9 S
9 G& E7 z( s: a, @
不做内循环 200s. F0 |! w* C* r! q
! e" W- T- W) l- m3 H# t# A/ v
你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 @3 y. ?! g* u/ i
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* A, E; S( f; n( v: l4 q$ m& V5 E
. I- J+ [' R+ R ^" L/ ~2 B
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
2 p# E' ^& w7 x3 }. I) X6 N
2 y2 T/ I. L/ p5 {' B. O(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)/ f" y) Z# Y/ D; E6 b) E
% z6 d) X1 g, [! B4 o6 i
std::vector < float > vec1(N);
9 z6 Q+ ~% q9 g4 V std::vector < float > vec2(N);; a" I8 U2 u* U* p
float* b1 = new float[N];
; c5 L1 D X0 Y+ ?* e% E) g- V float* b2 = new float[N];
, G8 s: p5 a( d9 ~( e6 W" C6 B
7 q, \; W% n5 E' P( E2 L for (int j = 0; j < 6000; j++). U: j1 S, B; g/ K$ D
{% E6 u+ F, B, ^8 f, `5 R3 E* |+ }
std::generate(vec1.begin(), vec1.end(), []() {* O9 | z7 u' h# n9 v
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ _8 X. a$ |: R7 p8 H
});4 ] j" `$ C' p0 \2 \2 M& W/ a5 ~
* y N& M' L9 J% E+ U
std::generate(vec2.begin(), vec2.end(), []() {$ ]7 k# [' j# E$ r
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
' y3 {$ R7 F; V& u });
4 N5 I# |! E' q3 C9 J$ |3 {+ r Z9 q% _6 c/ i; ~
for (size_t jj = 0; jj < vec1.size(); jj++)
- ^% J+ i# c+ r! W) @7 L) Y* ? {
, j8 v! M" Y8 a5 d b1[jj] = vec1[jj];& c& M$ f" ~2 @& ?8 j' E( w
}/ [1 H8 W9 ^) A8 q2 `/ a
# W! } L3 [# J
for (size_t jj = 0; jj < vec2.size(); jj++)
2 m4 _$ _0 l. M( E! O {& F5 V8 G& F0 A5 _- |
b2[jj] = vec2[jj];) L; Y# f( K) x
}3 N7 n% Y0 v8 A: z8 D; _
% p. Q4 y: B# A1 e; R //Method - 1 N=100000 247s / c6 V' }* v# d8 t' D$ D
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ @" w# R* J6 `* @) N
# X. i1 `% S% v! G; w //Method - 2 N=100000 237s
( O" H% S E/ j9 x+ o4 Y3 u5 ] /*2 V! \/ l9 A$ }8 Y6 j
for (int jj = 0; jj < N ; jj++)
5 l" v7 C9 M5 k% A# I, S$ }% ]( S. B {
" G3 Q, W, W W1 ^8 c8 C' V fresult += vec1[jj] * vec2[jj]; B. c5 F; a$ j: W7 b: V
}# D) |% n; c, B' l b
*/
) D, {3 @. w. P/ n) d0 W
( F" D, l9 t( C- r; o //Method - 3 N=100000 204s' N" p4 t4 l( w% R6 M$ |. u' y& Y
/*
) Z8 ~$ U2 q4 v/ q for (int jj = 0; jj < N; jj++)
X1 O) B" G5 |! ~: C8 r {
$ A! w! c: O! l! u9 I7 R; o fresult += b1[jj] * b2[jj];5 R/ V, \% f% x
}
8 T% H% A$ K* i */; ]6 i* e* \+ P1 K9 S/ j& c
5 w1 h2 C2 |# f" L! c
//Method - 4 202s
9 i/ n5 w% _4 ?0 Q& Z1 w7 y /*
$ i2 L; z) T( @- _$ |/ c2 P: Z8 M for (int jj = 0; jj < N; jj++)
$ W( y0 }: l# d8 _, ~7 X+ z {( L2 K& H8 B. w/ X2 U
! B( I8 p7 _; j& t
}, S, L! `6 i' ~( V8 `0 L6 J, x
*/
/ C4 Z, a* h( J2 ^" p$ K; w1 w# i //comment out all methods, N=100000 202s
% D0 _0 \7 d4 B% W }
# }! g' k4 _: u) {+ c: s& M( g
- j7 h2 h6 C w* p5 ^' j# ? delete []b1;
, r1 H" x! l6 Y8 s delete []b2;
$ M* S1 [7 i$ _8 X+ c! ~) v7 I7 ? |
|