TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 # t' I/ @' F5 I* ]; x/ S
6 G) V4 S# i2 F理了理思路,重新做了一个测试。# X4 t# j) R, o. t4 \
做了两个 vector 和 两个 float *, 都长 1000001 q" e" } |- d) r* i" z
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 |2 s) ?9 d% \! J
4 q. U! n( q: ?. G2 X# F# A内循环试了4种方法,
`4 l) T. i4 V6 s+ K: j" G; a1. 直接调用 vector inner_product 247s
# t2 a9 o& f& [1 E, e8 ?2. vector 循环点乘累加 237s# i& z: D- ^6 |3 N; H5 N! H
3. float * 循环点乘累加 204s6 W6 ]9 D( S( g) B& L
4. 空循环 100000 次 202s
/ Y1 B7 Q8 m+ l" i" n- f- o( c F: h$ \3 h9 M
不做内循环 200s/ m5 m H& w9 I+ r4 o! K! d. T9 O
) h* T" c3 i( G2 u# d
你昨天说的对,内循环本身占比是很小的,大头在其他处理。# S! h* O. i$ V# n" k! Y8 k
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
+ a8 n {) I' o! j2 \# Z2 j* R4 M* |% m- m; J
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)" a5 W. `! X: K
G/ p" C v' \) Y/ G0 {$ a
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)! f' N" C* `/ V8 m
, N# S/ C; n/ y, Y2 D' p std::vector < float > vec1(N);: p' i0 w3 K/ c
std::vector < float > vec2(N);
" C4 ]% O E) ?; X% E6 P float* b1 = new float[N];
* {2 i3 T6 M3 s/ ?& ?! m float* b2 = new float[N];9 u8 O& m% F$ g5 T( Q9 c! y# S, m
( U8 y( o6 |$ {4 c
for (int j = 0; j < 6000; j++)
* S% {6 f! E Q$ l {+ {- u: ^* w5 U3 J$ H" ^
std::generate(vec1.begin(), vec1.end(), []() {
# |) @! g$ u( M; b' n6 t+ h return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ L( W' {2 T- A# V% V
});, a9 p+ X6 \% O
. o' W% ?" [/ \, t4 X std::generate(vec2.begin(), vec2.end(), []() {, e) n2 n) ?1 f. r) \
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;7 Z* k: v; ^& [5 K3 d
});- i9 W3 ]; b5 K; p
% M4 z- r; V3 Z' | for (size_t jj = 0; jj < vec1.size(); jj++)
, q+ C6 m f! A* v7 d {: [ r5 B b5 _3 p! _
b1[jj] = vec1[jj];
/ }& s# [2 [9 Q# }+ f }
$ o7 T; O( B3 j T- x, B9 ^1 n% Y: P
7 \, v0 R P' z2 w0 I7 { for (size_t jj = 0; jj < vec2.size(); jj++), V& {5 K- {( b: N; q& y
{
/ e3 z; W+ K* e' i; W! R b2[jj] = vec2[jj]; Z" T: ]: H) N& [5 {% [* _
}( j; t% A/ z; E" j; X
]& T, A+ H4 `4 ?
//Method - 1 N=100000 247s 9 L* F2 [9 U4 }* h- z& r
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
- E8 t! k1 e6 L4 z2 ~) D5 T7 P8 q4 o4 j & h+ M$ h" X: \! e
//Method - 2 N=100000 237s
- [& D7 E" g& }- U+ v4 a /*7 ]) N1 ]: @' a8 l( b
for (int jj = 0; jj < N ; jj++)
1 x& \0 O7 }! r0 e1 w' i" w {
; i" R5 l4 ?& D* |0 ^& a1 t fresult += vec1[jj] * vec2[jj];. o6 X3 F, Z4 u' b8 X
}
( ]( r0 ]& D5 o- b */8 X/ _: F' [7 e5 y( N- N
# L5 h; s# V$ O9 G2 [
//Method - 3 N=100000 204s2 R2 O# H9 ^4 F
/*
% \4 \3 V( e# _4 |' i) w for (int jj = 0; jj < N; jj++)" \$ {2 o9 J% }) f( e1 [9 b
{2 j% p4 S. Z/ u+ u+ V
fresult += b1[jj] * b2[jj];0 S% p2 z7 C$ A) x
}# w2 w% M- }/ A0 y2 F" Y4 d
*/
, v& R5 K5 u0 K" a" ^' S& z+ m2 V7 m& |9 V
//Method - 4 202s9 f: ]. C. k3 x8 `' }, J/ ]7 T
/*3 d5 d' m* s/ w9 V
for (int jj = 0; jj < N; jj++)9 x y) H4 \( W; D
{ t- {/ S- \4 P& E8 I# U
" Q: c6 g$ m; r }) Q* T" m8 B' F
*/
) Y/ }8 g& Y- F3 a6 e //comment out all methods, N=100000 202s
7 E7 Y" N4 C+ o8 t' O4 `+ C }
) |% K0 ~) |& W* h4 \0 | c F0 ?; y; ]" T
delete []b1;1 ]( d1 T7 |4 r" q3 k6 p
delete []b2; ) J2 |: r n) _* @
|
|