TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 : H: e& |: Q& }, z7 p2 U
# z% S+ Q) b! u; c7 R* [
理了理思路,重新做了一个测试。$ g5 p N2 S. m6 N
做了两个 vector 和 两个 float *, 都长 100000* v) X. T$ g1 d
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.+ r ~. m4 V9 f, d9 W1 J8 I' i
4 ]" m9 T2 x* _内循环试了4种方法,7 S- e9 R# [$ N* R7 d! C* b
1. 直接调用 vector inner_product 247s $ u7 h3 ~0 n9 A5 F
2. vector 循环点乘累加 237s) M, E/ W3 s1 g' V3 Y& q
3. float * 循环点乘累加 204s
9 u+ |, X0 r, V; B8 h* _+ g4. 空循环 100000 次 202s
9 I+ U ~" H8 C: A/ h. o6 W9 L, A. R4 `' G1 O; x% b
不做内循环 200s. c, f0 G& ]" j; {9 y$ c
! G4 f8 J) }& C你昨天说的对,内循环本身占比是很小的,大头在其他处理。 ^" h& g4 S; `8 h
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
% ?# c& H0 C% I j9 W; Y7 Q) v' ^, N% j9 m5 |, Q
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
3 I: m$ c; I' [0 k- v W- p2 L+ o* F* @ \+ Q; h t5 z
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
) w8 E4 C" J. j. _
" w7 T Z- e. T4 R3 u; P std::vector < float > vec1(N);$ b m1 Y& [' A& e; B" H+ S
std::vector < float > vec2(N);
0 H* j# o/ E7 W V( e7 P: H$ E float* b1 = new float[N];
' f; l' R# W1 }% C- W/ ?' U float* b2 = new float[N];9 ~0 }9 C3 v( |! a: A
7 m2 |9 M: p% [$ M- K
for (int j = 0; j < 6000; j++)
; I8 a( K& S* f! N% {! G7 u {/ _- _: S: k) U* Q( U
std::generate(vec1.begin(), vec1.end(), []() {
. B, D" j o1 T6 @- [! s: y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;* R+ O P/ u5 A, C
});2 i7 T- v' [9 {
' e/ n, r* C R1 G2 k% ]
std::generate(vec2.begin(), vec2.end(), []() {8 R% R1 j% G" S3 N/ t1 t
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) h# C9 p8 B9 M
});
% G& [7 h2 @+ y6 Y* K; s6 t" l, O5 `7 Q/ F, ]8 _8 y8 ]# k$ _8 p) K
for (size_t jj = 0; jj < vec1.size(); jj++)
1 Q- W9 v- J; e' ?2 d+ M* f9 T+ t { x, W3 R. R8 k4 ^+ Z5 q1 @
b1[jj] = vec1[jj];
) G/ I$ f" d% w) K }, T" X% ^% o2 S) W3 }- z. U3 A
# y) u7 I5 ?7 z' _8 M/ E Z for (size_t jj = 0; jj < vec2.size(); jj++)
* ^4 |" c6 O4 Q! Y: O* A {
C& z1 l2 B: [0 P H2 A3 ?# i b2[jj] = vec2[jj];
; s/ d; E7 }- l) ]- F( J }
7 i3 A9 f8 R9 X8 \) f7 P) H3 J
E- E' o* Q. t# N. z //Method - 1 N=100000 247s 0 x1 i. J& Z. E2 U
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
9 O8 k/ f: f, V/ ]% M( U
* a1 I+ {" ^1 G7 f- J/ w% Q //Method - 2 N=100000 237s9 Y/ Z+ c& _1 }: T+ u5 A
/*
7 C: D* b( _! l& Z& Z for (int jj = 0; jj < N ; jj++)
$ l( |$ F/ M8 d% T {
, o6 m; h8 Y- o2 j: n( M fresult += vec1[jj] * vec2[jj];% R2 N- ]' }2 J
}4 t3 n c1 m& ?1 v4 b1 M
*/
8 _; @* I$ T. h, J3 W$ d, }* U
2 @; \( {% V0 \, P/ y6 R) S //Method - 3 N=100000 204s+ Q5 q, l! |/ j7 N6 \# ]- a
/*
4 t$ ~# V/ b1 n% u% ]" I) d2 } for (int jj = 0; jj < N; jj++)
' q% H1 p) r; e0 K& l {
2 _6 m) A0 q; [6 S, n% f$ F fresult += b1[jj] * b2[jj];
: r: r8 J* D1 J7 g9 A }& d! h6 v2 R& v* ^) D
*/1 S8 o9 {; d1 _8 @) k7 F8 }
0 R; L& \, X/ A. u Y4 F3 r //Method - 4 202s* E, V) ~. r5 l) t" Y
/*
$ l6 x# k8 u1 S) q6 o5 u; Z for (int jj = 0; jj < N; jj++)
; f( K/ ~8 B+ y' w {
8 z& ~8 k3 n2 R/ ?6 O
, p9 i9 U, {) B( ?8 I }6 r$ w3 M" O# k
*/% g. q" z' h# p/ L/ Q( y8 B O
//comment out all methods, N=100000 202s h( Y9 p1 \2 Q3 y% o+ K
}% Y$ }' {4 V/ u3 M8 P5 h
- l& U% @. ~" O% P delete []b1;
) `+ l$ a2 j; l0 V/ ?8 u3 u, | delete []b2; + W9 q9 T2 L1 L$ R& N, H
|
|