TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
; f# M6 N6 W8 ?# ?& y: N6 P8 L) ^( ~8 E2 c, f' Z
理了理思路,重新做了一个测试。
" j6 t0 ?% x0 k$ Q4 G8 E做了两个 vector 和 两个 float *, 都长 100000
& U* P7 E% s1 k/ j4 @# n外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
- c& U- A1 ^, h3 i# A- T6 @2 P5 e! o" N7 H
内循环试了4种方法,! o3 h( }- H* N4 `# c/ G6 m2 v' \, _
1. 直接调用 vector inner_product 247s ! d z+ B) F. m1 z- R
2. vector 循环点乘累加 237s
- o$ e/ f) |! ?" O3. float * 循环点乘累加 204s- h+ A0 L2 A# h
4. 空循环 100000 次 202s3 o# c+ ~2 z; h! `9 D2 [
( Q; D' m0 i7 d, p1 I不做内循环 200s0 u( c2 C; |8 _/ v+ Q
- W" c5 @- m* {你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 O1 m+ v- b5 a% Z; J% D: u1 z3 v
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
9 y0 T6 \; p) x6 `5 ~/ ]( t9 m! s+ W
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)4 C9 j- x Y( q, |
1 T6 p1 v, f( p" y* e# y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)! z- O g# |2 Y1 `& V% V
" P' ]2 \$ M3 J, b; Y
std::vector < float > vec1(N);! }; ?4 w# y2 E; Q0 }
std::vector < float > vec2(N);
) D+ A' e9 Q; Z+ Q) H% `" \5 [# o float* b1 = new float[N];
* W, i+ D" d' G/ u. V y. ~ float* b2 = new float[N];7 g& |6 H/ u! u
* Y4 s- \( b. b, O
for (int j = 0; j < 6000; j++)! G4 E6 J1 k, v6 C- `) @
{! ~+ a1 R: c6 r9 Z
std::generate(vec1.begin(), vec1.end(), []() {7 j8 S# f$ u- c5 Q) [) @( @& G
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;1 K# N2 J. U8 O( @% J' T) G* f4 {
});, s3 B% W9 G1 R7 K! h# |
$ R$ O5 l4 u) W! @( P7 k) L7 u std::generate(vec2.begin(), vec2.end(), []() {+ D6 ^+ m% ?2 J6 }. ?
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;3 d" V+ Y: R2 K3 V6 e" B& @1 ^
});) g0 ?# { G' {+ H
0 L( G- r2 K) k3 U6 ~ H for (size_t jj = 0; jj < vec1.size(); jj++)
' Z5 f8 g, t# I( B/ H3 N {
1 c+ E% O6 ]4 o) h8 ^ b1[jj] = vec1[jj];/ b- C1 ~' w& ?2 i% n
}7 B2 i0 [- M/ J. D, ?8 \
% ?8 R; f0 h! q, W$ S' n
for (size_t jj = 0; jj < vec2.size(); jj++)
4 Z6 P" q6 ?7 W) x- ] B" N2 ^ {
7 }$ r8 i/ m: N$ f2 z6 C4 r b2[jj] = vec2[jj];
1 p! N, u1 o8 H% _ }
/ u& w7 s* J; G4 U' s& t( r6 n. u' y" n: Y$ Z& [
//Method - 1 N=100000 247s 0 p4 n) A! v( F+ I! }
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
5 H7 U" ^) |# }8 C2 y
& A/ c g" X N4 Q //Method - 2 N=100000 237s
" X$ R6 o* A; Z) \5 z /*
" s$ n* F5 ^" X% U$ W for (int jj = 0; jj < N ; jj++)# p2 z9 L u$ u) o# }, X- }
{
6 o! {9 l- c' @5 H# o7 |2 G fresult += vec1[jj] * vec2[jj];
5 F) x; `2 W1 M1 `1 a }* L1 a N; D4 Z
*/1 v5 N' k3 E7 s
% O7 T0 q# N! h# [. E4 }% `
//Method - 3 N=100000 204s
& X. n0 p/ ~2 I7 t6 v /*
% U$ R4 O! e, x4 ^: U" P+ p for (int jj = 0; jj < N; jj++)5 S2 W4 ?9 q8 x
{
1 s3 X7 c5 X" Y ], |" u _ fresult += b1[jj] * b2[jj];+ Y& l- o) u( a9 o2 t1 K
}% |* ] u; w2 ~- @7 {
*/
% ?' y# C8 @$ m8 R$ a! }1 J3 x
6 I9 u5 ?8 F: m" G6 l- b //Method - 4 202s% \* V+ e! E2 B( ]1 {5 R7 C" N( v
/*8 j1 L: w- C( @) s
for (int jj = 0; jj < N; jj++)
3 O& Y( r, f! i) s0 L3 Z {7 U6 Q; ]8 k) F& w% Y
0 T \" @; S @: @1 [( K4 P' v
}' G: }+ ~) N7 m- u8 q( H
*/
. g- F$ a; h& } //comment out all methods, N=100000 202s % b } K! H7 n' P( m
}
2 |* ?/ y: Q' b% Y: n) j4 K# O0 }- I
delete []b1;5 v& h& s5 V0 I c! c
delete []b2; 0 y: P. K: |2 s$ U3 e$ n
|
|