TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 h* K ~" X4 k1 C
1 i8 u" m9 Q2 C! L1 o* q8 i理了理思路,重新做了一个测试。
. x+ D( l( Q( k! }8 I, Q1 m做了两个 vector 和 两个 float *, 都长 100000
9 r5 q3 n4 W9 Q+ f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
! j9 g0 Y' G5 \4 q! w8 F" n' F4 P% {4 m4 t
内循环试了4种方法,
. Q9 C/ L, V3 Z. k& e& U, I% b4 G% z1. 直接调用 vector inner_product 247s . t/ R6 H" N2 T) R, y
2. vector 循环点乘累加 237s
7 q9 a1 _6 }+ J6 K8 u2 A3. float * 循环点乘累加 204s+ N. O/ Y6 ]' u
4. 空循环 100000 次 202s' A( `1 [4 F% G3 e" E
7 x% ]1 Y" n4 P; c( h7 F# T, a. t不做内循环 200s9 C. B4 s* W( r7 A0 X' F5 l2 c: K
; o0 {0 A8 Q' ~. y# C' c
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ h( Y- W J0 b另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( s6 h: n+ {9 p
) S% }7 ~* {' [) E$ h2 O4 A至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
& c/ D: X6 O4 T1 d. n! [1 n: I" i7 Z6 a. v) m) o0 f
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
! u' L, C2 g: S9 [5 s9 _) f8 ?( D) ^ ` P' F2 y4 q( C
std::vector < float > vec1(N);# i: z8 ^! l/ Q1 ?9 z2 `
std::vector < float > vec2(N);6 E0 l3 ~& z, Y4 D1 c6 n
float* b1 = new float[N]; n: l0 A/ |( c1 L8 @& M1 l
float* b2 = new float[N];% A# w T% k5 k/ ]4 U
! ^7 `% p# t. R7 |' H" r ~7 J+ c for (int j = 0; j < 6000; j++)
7 \( T5 _4 R! [# { {0 M8 W& S, W' ^( m2 R4 @7 _
std::generate(vec1.begin(), vec1.end(), []() {
1 c. U; \6 p5 N9 H3 D% E; _ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
# X4 M; e1 J: J# a% S });- Q9 `. x$ j/ g' _
3 I- C) ]6 X5 X. b std::generate(vec2.begin(), vec2.end(), []() {" d- ?& t% E+ v) f: i% n! O# ^
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
; B8 Y7 s% G1 C, B+ H+ _+ T5 T+ v });- a- N, W0 F; t3 b
2 q- B1 z2 G' h1 e/ @
for (size_t jj = 0; jj < vec1.size(); jj++)
* V: d: N* u7 T) r5 S' Q {' U% f6 P: S% W0 P3 C
b1[jj] = vec1[jj];) |: t6 w: o/ D9 L5 A; P
}
' O0 f' p; C$ T. p- R: H1 _1 b+ [* |0 I" M+ g$ V5 K, s! J% G
for (size_t jj = 0; jj < vec2.size(); jj++)! B6 I' L: {# `+ v- @
{9 [ i1 F4 c, H2 ~# S( A# H& ~) d
b2[jj] = vec2[jj];* a* s J. B4 g1 {: G
}
- N. t$ X: Y! }. Y7 y) @4 ~3 w! @) V
//Method - 1 N=100000 247s
2 ?8 L2 Q$ ^+ H) g0 j3 Q w' \ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);9 k$ |# @; g$ J, s B v
2 b$ E9 }' J; Z/ t4 o, L/ b
//Method - 2 N=100000 237s
* E$ b5 E% E7 i: `+ _- |/ ] /*
# a$ \. {& D0 i( m6 a for (int jj = 0; jj < N ; jj++)" S% \ e; c2 }6 S- Z. M' b
{
7 b' n3 ]6 \( N% K# B1 R fresult += vec1[jj] * vec2[jj];
3 R9 z3 e# k% U! Y2 i8 ] }
5 b+ I5 y* M: l1 w */
' |9 l2 S: W, K2 M$ f7 @7 Q
2 C0 g1 q5 d* o2 l2 X$ f //Method - 3 N=100000 204s
2 D9 Q& Z4 v9 O0 D" l7 i1 ?$ W /*
: T$ j) I( F" c# ]! C5 l, B1 [ for (int jj = 0; jj < N; jj++)
3 T$ L$ y* s) N9 Y5 a% ~" c- e {; \% j% A( h! N. g2 u( ]( v$ }2 a d
fresult += b1[jj] * b2[jj];
! a! j2 K0 ?2 {$ B& ~& z, R% H }
/ ]7 W9 A# e3 q; L. q */
. y8 M4 h4 Z0 }8 E3 i' V' q2 m. f# Q" t
//Method - 4 202s
9 j7 B* O5 P+ }6 Q /*
! m. F' N: t- _1 \% u; e for (int jj = 0; jj < N; jj++)' o9 I8 O& P9 h; e) \8 F# m( e
{
8 v# r3 P1 \9 o9 J! O ~# ?. x
; c1 U! a0 A- q' X }
. N2 g/ W. A7 d; d9 r+ x */$ T [; B" C9 O7 b4 ~7 l5 F$ A' M
//comment out all methods, N=100000 202s 7 l2 w$ @0 k9 P0 @
}
5 l6 x0 i- k" ]; {: M4 F: U$ \4 q$ g: g7 F' S' W2 h
delete []b1;
9 q8 {8 s# o7 k6 u) L8 R- a delete []b2; / p+ j: x: i3 R0 W S/ }- p* Q
|
|