TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ; r- c0 d7 p2 t, z: c: X) N
0 ?2 m) m' A9 S# B# S
理了理思路,重新做了一个测试。+ W8 \; @4 _. Z0 q
做了两个 vector 和 两个 float *, 都长 100000
9 u2 Q9 O, S+ @3 \& p外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 F& M; n5 r1 E5 j$ R) |9 M; V I
# O/ F& O, C7 S6 Q& u/ {+ g: i2 `+ _
内循环试了4种方法,5 r; }# x; V( z: s) v1 }4 K
1. 直接调用 vector inner_product 247s 5 G: b% N- e7 {3 ?( k
2. vector 循环点乘累加 237s4 E6 }1 b; `$ @$ P/ B( L) a) Z: |# c
3. float * 循环点乘累加 204s& Y" ^. g# p% l. j- J6 ~% x7 n- ^
4. 空循环 100000 次 202s
. Z0 f. e8 o# E
$ Z5 }3 [5 F: E9 G1 } {不做内循环 200s8 m. C( n2 e5 m; E1 K& X
& c4 B6 b( n2 V' ~( s你昨天说的对,内循环本身占比是很小的,大头在其他处理。
3 y9 S6 Y L8 T# D% }7 \另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。+ O+ A% a. r0 ^- F+ f
+ q4 T$ S# b* x/ Y8 Q7 g: @至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)- _. E7 m0 T+ P
. @7 X: L q" g; ^' F
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)/ ^ I$ X3 ~- V* p+ [" j
$ `1 R# j- }! @5 H
std::vector < float > vec1(N);, v8 o2 t* n7 I. f& w9 I
std::vector < float > vec2(N);
" x1 V! v5 |, }/ U( M0 W9 y float* b1 = new float[N];' ^. {, x1 k* K( R4 d) k
float* b2 = new float[N];9 |9 W/ L, Y2 k9 e8 V v
/ G9 {4 [) n3 R5 K) M+ z1 z$ V( L for (int j = 0; j < 6000; j++) a, k+ E6 \* i! t% e* \ h k
{3 U& }# F& Z5 w. H, O- i, q! D
std::generate(vec1.begin(), vec1.end(), []() {& j. I2 i0 e$ j- S0 K% E. \
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
}: L' g$ M; S' S3 J' R });) l. ?1 b& G" ?. r7 n' o
8 O) H7 s5 u, E( k6 g std::generate(vec2.begin(), vec2.end(), []() {1 r! @; p/ |; @4 B0 O6 I! L
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
4 f, i; X& E1 L0 R n+ c });# }; i" k; Z: N; m
* C: u2 c B) |1 u: ` for (size_t jj = 0; jj < vec1.size(); jj++)) Y; i% |+ Q( C' h7 T& O' T
{6 ~) P r( `5 d8 R
b1[jj] = vec1[jj];
6 C2 d7 Y) S7 P- [ }% ^* H r' ^ [7 h
0 D. Y3 ?0 r8 h8 E2 q* _; f
for (size_t jj = 0; jj < vec2.size(); jj++)3 n. N1 O- X7 [
{" Z% p/ }3 a( p
b2[jj] = vec2[jj];7 Q# J+ a. ?" J5 k3 b! s
}1 @& P- ?/ l' D1 ?& e% V: W
# F0 i: z+ [$ z+ ?4 m& X7 Z //Method - 1 N=100000 247s k/ \: _0 y" X
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ r+ g/ P/ B; z3 j, v# L8 R
! y. y8 F' |4 ]3 v //Method - 2 N=100000 237s& f( Y: Q1 Q Q9 m5 m6 x; g! K+ a
/*
; P' n# v0 e6 E* i- Y( [: r for (int jj = 0; jj < N ; jj++). t% [) g. Q4 \- j, ]& \
{
6 Y; \4 P& c2 a! Y( e9 E fresult += vec1[jj] * vec2[jj];9 k- H3 F1 j; W. |1 @, M/ x
} {- c) D1 q o6 t
*/4 M$ a+ h/ x3 m" Z& K1 p
# R6 i8 B$ F' Z( e, ?( Q
//Method - 3 N=100000 204s
( {: b6 _( q8 o3 S, \7 j /*% V/ D/ E2 ~0 N0 O+ b) N
for (int jj = 0; jj < N; jj++)
# ^! L3 k) \$ ]8 g5 D7 L; W {, }5 H! }, H2 Y& q6 @9 A
fresult += b1[jj] * b2[jj];/ @, p6 F, y+ }+ E
}
- D! P, d; M( g, d */7 U, B2 Z4 A2 Y$ p4 ^ [# o
/ G( K9 m% d6 B' D! F' B' E: ]; N
//Method - 4 202s
! o# a8 X3 P# c* [2 i, u6 i /*6 R8 z: W3 N7 m' j$ ^
for (int jj = 0; jj < N; jj++)# c) \! F. j! g. w) c: P% j# C
{4 _3 t% P; t, x7 U4 v& M# P" h$ K
* [% t* t# O9 C, J( u }' W1 O, ^4 d3 F
*/' c F( ~( W( u% [& B, {
//comment out all methods, N=100000 202s
p( V& e+ T9 _3 m( T/ Z }; n% d- W6 F. H5 D9 T
2 A' h: E) r+ o9 R# T ] delete []b1;8 Q0 X$ k! B8 P* x1 b- Z, Z
delete []b2;
8 ~" E% X3 W1 C6 k$ Y2 e |
|