TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ( w- y) x: x& ~+ s
# n q! x0 f2 I# C f- y
理了理思路,重新做了一个测试。. ~/ L! q; V/ L, u* \5 @
做了两个 vector 和 两个 float *, 都长 100000
* c5 ?$ L) N! M外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. H) _( N% U( \9 t# I* @
8 }& ]! ^! [( W/ s
内循环试了4种方法,
7 Z5 V9 r5 @, E( H/ U& ~- k/ [) `1. 直接调用 vector inner_product 247s _- _7 w; R: m9 c: @* k$ X/ v
2. vector 循环点乘累加 237s1 j9 y% w1 r4 A/ R" A: P2 u
3. float * 循环点乘累加 204s
; P3 E! r) ~" j1 W6 P' D1 c w3 w4. 空循环 100000 次 202s
* _" @$ ^$ I0 b# A9 k
" M/ e4 x+ S, r; h+ N不做内循环 200s7 \3 v+ }9 l: b4 D- u$ D i2 a
( C, E; \, }9 T' S
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
' l1 e! m8 I1 p! H a& q另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
( i* p2 @1 |2 Z" c) x- `1 y0 ?$ G) |5 T4 l' t
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
: d7 F: P- d, N5 C6 Q2 \7 L. {# k6 \$ ~! I/ @
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)( W- [- h V/ w* e6 T( z& Z9 F) s
6 V+ I2 I( [3 w. s
std::vector < float > vec1(N);# B( K! _( Z. X6 G! \9 s
std::vector < float > vec2(N);$ E. |3 ?$ B4 j, j d+ F z
float* b1 = new float[N];
' }. e0 }8 V$ m$ F float* b2 = new float[N];, e1 S7 }0 r( u' |
# E; @8 {7 D- O W' a7 L
for (int j = 0; j < 6000; j++)8 s' o( b1 I1 h# v z
{
7 ~1 i" F# n ? A std::generate(vec1.begin(), vec1.end(), []() {" i+ F: z" A8 h& U j3 e
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
8 i2 }1 Q: s. d });
( ^; A; \7 C: _6 M/ u1 z- y
$ T( D: T4 r3 a; Y% t, r std::generate(vec2.begin(), vec2.end(), []() {+ G- E5 r) F+ s* {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, W5 b, ^2 u! m6 y- ]- e; O4 I0 {, g
});" f; ?- x% _0 \1 `7 ^; u! v0 |% V
0 Q Y9 E5 L) o! x
for (size_t jj = 0; jj < vec1.size(); jj++)6 `+ c3 a2 c4 Y, I( t
{- Z' t" e) ?# T4 Z0 l! s6 ?* o/ D
b1[jj] = vec1[jj];
4 i9 C& l5 U T4 M }
" g! H& j: ?0 Y, c) Q1 a/ C3 k/ ? x+ d1 F
for (size_t jj = 0; jj < vec2.size(); jj++)0 }9 h9 |, f3 Q6 q! }
{1 A& j! f7 }$ a$ N- ?
b2[jj] = vec2[jj];1 e X' k. N# B" e6 ]
}2 C7 k1 p9 i- Y! c/ J" v4 z- z
2 g' R- d8 n2 l
//Method - 1 N=100000 247s
! }4 E# o2 ^8 d1 a: V2 G //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ f, i3 l6 x, T
: _, i- x0 V6 W$ |" q& G+ T
//Method - 2 N=100000 237s" S0 t) I! n5 B% _( x! R
/*
. X/ ^. l% s) b for (int jj = 0; jj < N ; jj++)
2 [& Z: i8 a) l6 ~ {/ s/ `$ s" l' t+ @
fresult += vec1[jj] * vec2[jj];
& K4 u4 G$ D5 A6 M# S4 G% F- j7 Z }" q0 e/ [# i. Y% _% {" D6 G
*/
5 l3 {7 h* b N4 E 0 Y* H9 ^8 z" ^5 G1 v
//Method - 3 N=100000 204s
/ X: O# S/ I3 Q: n; B /*
2 l( z8 M4 c) g for (int jj = 0; jj < N; jj++); H* I, c! ^8 k: n( _ q
{
3 B1 N) ^& S& N fresult += b1[jj] * b2[jj];
3 m4 Q r" K. p6 A+ h# F }
+ C/ s3 D5 [0 q+ P% `$ c */! w! ~/ Q1 i% H/ ]% v
, R9 G1 W, P- A* n //Method - 4 202s5 j0 e6 N: b: f1 v
/*! |% X# h% V( b3 x
for (int jj = 0; jj < N; jj++) y1 T$ C/ R6 ?8 j% h# e
{
& w$ R, I5 K6 l |3 ~
6 I8 q7 S- P9 W$ U$ ?2 c$ E5 f* ^ }
) K; z! l9 M" E4 a% [# B. c @ */4 w: ~! H4 F+ r0 X
//comment out all methods, N=100000 202s , L) d) o8 A+ N* b( X5 b. }
}
$ q( s) @' I- S. F* {$ C) w4 }- \; s4 R/ a
delete []b1;% c, K9 a. K- z) o& u
delete []b2; # Y. x; R% | n+ W$ b, C
|
|