TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
b" [( _' p. f: z& B5 p0 y0 ~( \1 e- R
理了理思路,重新做了一个测试。
" m/ l: y7 a; g# q6 f: `; {做了两个 vector 和 两个 float *, 都长 100000
* y2 x# I- f) i @. q9 @% }外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
& R; i; R$ l2 S' ?0 B0 i$ G$ f* Y. L0 J. `5 a6 h4 _
内循环试了4种方法,7 z4 H" Q* J2 k0 L# Q0 ^% C
1. 直接调用 vector inner_product 247s 4 Y; i) O7 ~; n# ^; ]* U* h7 C& F
2. vector 循环点乘累加 237s
' o" N7 L: M) `' |; d" F3. float * 循环点乘累加 204s% g- V+ x0 c* s" m: o
4. 空循环 100000 次 202s
6 o) s6 v, K/ g# ?* z- K5 s" o
; B: f9 p6 ^9 j9 J$ P不做内循环 200s
0 X: q# |0 z! N8 E% h5 ^9 \( F1 M4 ]- U7 D3 g( _
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 O$ X+ ^6 E3 \& ?, t! R另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
7 p. y5 P) [! b0 r K* u: b4 S
- o8 _4 F1 H0 A至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
; _6 J2 b3 [, \3 N: z$ ^3 n& y# G/ X; M5 n' d3 w
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)) u! `/ | {' ?4 w; B
! M! o4 {& ~1 \1 B# g; \ std::vector < float > vec1(N);
8 E9 e8 w* i3 _! e% x$ ^# X( g: Q B std::vector < float > vec2(N);
' ?# W/ f! {. g% X2 a b% | r float* b1 = new float[N];
9 \2 _4 T6 a$ y float* b2 = new float[N];
8 Y) l& \3 G2 U7 I3 h; t$ B6 b
for (int j = 0; j < 6000; j++)8 A( i- V; i ]* G) P
{
+ e# i1 U: f x std::generate(vec1.begin(), vec1.end(), []() {3 q/ s6 O3 `3 x
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
% M- ]3 \% T, u: v# h' c p });2 q3 k/ m1 d# r2 U% t) q
" @5 m9 ~7 p/ l9 a
std::generate(vec2.begin(), vec2.end(), []() {
; X( c2 h5 a! z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;" Q% D: D. e8 r+ \6 j! _& y! g
});
$ s0 M- N* e) P, J% ]$ Y
/ a: w& V0 y$ Y3 m0 t2 i for (size_t jj = 0; jj < vec1.size(); jj++)
( L( F7 X6 S& o( U$ I {
( q8 g; B! e$ t* v$ s, b- v b1[jj] = vec1[jj];
, d, ?1 u d) k }: d2 a3 v) C# H: w: M2 S* G
6 }, w+ r# L' c! k( h
for (size_t jj = 0; jj < vec2.size(); jj++)8 b& { W! ^/ k& w5 X; }6 {! R
{
! ]7 g1 A; H V b2[jj] = vec2[jj];& v# E9 Z+ o. e. B' p
}/ ^+ v) V- T7 a8 \) s4 c
+ Z6 u- F% Z. k9 v: E //Method - 1 N=100000 247s
- u E# e" d$ J" x) O0 j //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
, g8 l5 U/ x! L, x2 _ $ C7 I* ?; o4 S2 C# r$ J8 O8 E* n
//Method - 2 N=100000 237s5 Q2 M. c( k8 J" j$ R7 y
/*
$ j/ w; t5 H, _$ ]' u7 Q. ?& x for (int jj = 0; jj < N ; jj++)
4 t; j: G" i' S) f( D7 f0 U {8 L- O* F r& `: P! q/ a
fresult += vec1[jj] * vec2[jj];' X- G @4 u/ Y4 E9 R% t" S
}3 M. x4 C; N* {) {- d: N& f& S) K* H
*/
% l4 U I. ?: o+ ^! a! b
: I! D+ s2 K+ \& f Z1 K //Method - 3 N=100000 204s/ L/ Z( f l8 T, {+ i9 L. B" w
/*5 G! N% ?* v& a7 D$ o/ O, z7 |
for (int jj = 0; jj < N; jj++)
/ X' A# g3 O! A) a+ y' [ ]+ T {' M" r8 \8 C9 G6 Y6 a% G, X$ F6 ]
fresult += b1[jj] * b2[jj];& X C! D5 ?; s! U3 l
}: G8 F6 b9 z: w: {+ a- w# `, I
*/
; {1 S% o2 c+ h4 z
. w8 g' h& a7 U/ D1 J; K& i //Method - 4 202s% x0 [2 U, s9 a# }- Q9 X
/*, E, ?: f8 m5 h, `+ O+ U# T- \' g, F
for (int jj = 0; jj < N; jj++)$ N* q# R3 J8 C& M( I3 Z
{
# \/ a) _6 C% v) `- A1 U; f ! e0 q# S; P1 T4 j- T' i
}
; C) k. G8 s6 s */" G4 t- _9 {5 z) q9 ]' V6 I
//comment out all methods, N=100000 202s ' j/ g; Q+ i1 }% v+ a5 U# U
}3 E7 k" V0 l/ V3 e' t0 n; H
. A; Y/ u) T( w7 X( j
delete []b1;
* m+ f- O" q/ j4 f delete []b2;
6 E+ o D) z9 U/ B- C) u |
|