TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 I: D8 E: N: g3 J; n) w3 v
3 e( c+ g/ k& M' w l% Q( y5 ~理了理思路,重新做了一个测试。+ q5 B1 b- W/ D3 m
做了两个 vector 和 两个 float *, 都长 100000+ r1 G7 r0 h3 @% `8 C
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' \' w, l1 H2 o3 P% K% h- H v" k8 e( A/ l$ l
内循环试了4种方法,
% \ n4 f* M" F; `- l; y$ r% O& a9 a1. 直接调用 vector inner_product 247s 8 i1 |" |- b# D4 P& u @+ h
2. vector 循环点乘累加 237s
& e- O& @8 [2 s3 m5 L. f3. float * 循环点乘累加 204s5 V7 j- g0 [+ w2 b7 P2 u* w& G
4. 空循环 100000 次 202s
+ e3 w+ S) R# R1 x% a
% H' q4 T0 y4 I( ?) O不做内循环 200s
' }+ z* o3 q \- F4 T$ F
" R' |3 R' g' I/ b: X9 ~' V: j你昨天说的对,内循环本身占比是很小的,大头在其他处理。. l1 O) H2 H2 X% Q! _ }9 Q) P3 S
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。" M3 f3 ]% S8 s1 y3 U& K- k
% g q7 d% a( h$ N& ?/ [
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
" U6 u o6 l! a4 K# d; [2 ?& `( j! z
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)/ Z! b9 ] x! p' m6 r- z
# S% x. [0 P! V/ p std::vector < float > vec1(N);
5 p6 l o) I; a std::vector < float > vec2(N);
7 `$ c1 o8 W! H ?0 _ float* b1 = new float[N];3 m( B/ p8 A4 b% ^$ Y2 \
float* b2 = new float[N];
5 H' [& p: a1 x- O- W5 L
; }0 _% J( n7 ~4 o for (int j = 0; j < 6000; j++)
A9 [+ m# e) y2 ~ {& @/ t; w- K& {. R$ d
std::generate(vec1.begin(), vec1.end(), []() {. P9 V# w7 k+ e+ L
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ o4 L, Z' H, H; U; J- M6 I
});3 N! \& l2 B) a. w8 ~/ l5 ?6 O$ N
4 ^9 i R S4 F8 O2 o std::generate(vec2.begin(), vec2.end(), []() {
2 u1 ~: H& B2 h5 E% ]. C" R return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 A6 @: Z+ p- O2 m- |/ o& g8 N- v
});
7 d, s1 C) X9 v
0 W# s1 q2 ]" [7 C( K8 @( u for (size_t jj = 0; jj < vec1.size(); jj++)4 U5 {7 l& B# e3 @
{
. g3 L+ O7 X3 u! N5 g: O4 h b1[jj] = vec1[jj];: j* v& V; ^3 \7 t+ a
}
4 i+ ?6 r8 S, S
2 h+ Y6 Y3 r) b for (size_t jj = 0; jj < vec2.size(); jj++)
% b4 a: w* z9 B, v1 v {
' F3 }$ g5 @- y2 ^" [* U9 J3 a b2[jj] = vec2[jj];& k. U/ w8 ~( i5 y7 U0 F
}# H( k: Q; b' R
1 w1 _2 w- U2 B
//Method - 1 N=100000 247s
+ X8 P4 }( {/ j //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ L) K+ F! X" a1 l5 a 2 ~3 e! z) K" ?
//Method - 2 N=100000 237s
4 X5 D1 S& E5 [* b /*5 D# ^$ f& D3 P. I# e+ ^; J, t
for (int jj = 0; jj < N ; jj++)3 q: y& ~. z1 J1 b; l
{3 D: b9 y' ^' ~! B3 O
fresult += vec1[jj] * vec2[jj];
; v4 H. s/ Z- H* r& A1 _ }
Y7 F( U. }# v2 J+ V */
) c0 X- S4 Y/ m8 n, X0 }2 q9 H
" U: H1 B5 ^/ u- G# R7 _( z! v) p //Method - 3 N=100000 204s7 R% E* S; @0 @/ o6 u
/*% n: B5 ?) z8 h) U+ a! X
for (int jj = 0; jj < N; jj++)* ` Z6 c# Y C0 w; w: S0 w
{; B8 s7 s5 Z6 v' B
fresult += b1[jj] * b2[jj];2 O8 f9 P% }; v: B. s6 [
}% ?: [/ k9 A: `( q7 Z, ^+ I' n
*/
' O) ]% y0 c r- D/ u5 w) |1 M+ ]0 ?4 I7 E0 S) C: p+ M; }; ^! n+ R, _" k. p
//Method - 4 202s @- b- W# G2 b7 J0 q
/*
\2 E l. w1 g, K- X for (int jj = 0; jj < N; jj++)
9 ]" I6 J* `! ~1 m2 S" \- v& g+ l8 Y {
, {' [2 A' a) _2 B$ O, p2 P6 f4 k $ ]) S8 p, K8 B+ P) j; i" `
}
0 E( V& X( A; u) a8 R: K */1 L/ P8 k" r' ]( D
//comment out all methods, N=100000 202s
, H2 i$ H1 u W* E+ C- G }
% p, m" w2 O" m' p
3 Y/ e( ~) U; j6 g1 i. C. p- p delete []b1;
# p3 c! o0 F- ]$ Y* h" D2 f delete []b2; 6 |% N @3 Q) X6 D u
|
|