TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
- ?+ `' Z9 H9 @. @+ ~# u
* ]# @& S6 J; w理了理思路,重新做了一个测试。; f- w8 y9 u4 `
做了两个 vector 和 两个 float *, 都长 100000
% s0 `' T: o4 S' m外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
& e& U! t, X% I7 d" }# B, O$ O3 y" ?; @5 w
内循环试了4种方法,8 }4 G& y3 h8 |) t, J* t
1. 直接调用 vector inner_product 247s 1 C# _8 S4 X! `* T
2. vector 循环点乘累加 237s
$ O$ A/ S' J+ w2 I8 P3. float * 循环点乘累加 204s7 w+ e6 h h- t5 @
4. 空循环 100000 次 202s
, z" c9 _9 j$ }) Z) A$ T8 k' l9 i/ _) n( W0 c9 V% X
不做内循环 200s0 t, X! M3 ^+ s; ]8 T! Y/ d% I
" S4 v" T' H$ H# ]0 O( G" n# P
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
- A5 N- Y+ U# i- T- a另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
r9 r5 G8 Z2 B' L0 j8 N3 E. e
7 `0 ^& N- ^* M2 L t- T; a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
2 U+ f# \5 V& a& g: k6 u0 E' n6 ?4 M# t4 s& \ `4 {; H6 K
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)# [; N; _3 q: S1 a
" r% q4 B4 I% C. x& ^
std::vector < float > vec1(N);' h9 A; \7 e; P6 p; }% Y6 i; G- a3 B
std::vector < float > vec2(N); @4 U) Y% V+ @
float* b1 = new float[N];2 ?* T0 @0 n9 R1 x- q6 a
float* b2 = new float[N];
! b3 _+ ]! S7 D- B8 _
$ n% ~; E$ D2 | for (int j = 0; j < 6000; j++)
; K+ I% I+ W8 m" ]- z {$ E4 B& o" M* h/ r5 k1 |( W
std::generate(vec1.begin(), vec1.end(), []() {6 n& H k1 V) P! m' ?$ j
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;. n8 A% l, I( P; Y- L7 N0 e8 x
});6 C- J/ n1 m6 }% H! ?
" |9 k. G0 _9 a3 m J+ s6 T; f2 w( D std::generate(vec2.begin(), vec2.end(), []() {
C/ |' n% d" I1 C* w5 @2 E* A return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
# E& T/ g k" E });
* X7 \5 K. F7 y" M1 j; S* i" q; }' o) G! [% y8 U
for (size_t jj = 0; jj < vec1.size(); jj++)/ h4 }( D/ e4 h' X4 W1 X3 S
{
/ z+ f4 G% R( L+ i" V- I* {* N4 V8 M b1[jj] = vec1[jj];
. {2 w! L# \6 v0 y: q }: t9 G8 @& i: T, ~9 n
8 t- s$ D6 G* L) T o/ X for (size_t jj = 0; jj < vec2.size(); jj++)
, ~5 h& @( n" }- L, Y1 N$ H$ E7 P {) p( z. m* b8 L2 y0 m( \4 B
b2[jj] = vec2[jj];
; g0 o9 ^, {! u: C$ ^# E, z6 Z }7 j- Z, G: _- J* Z2 x% c8 [
& h2 t' I/ r& O2 n z1 [2 m
//Method - 1 N=100000 247s
8 m8 I4 [5 a3 C* D //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ k' q' R+ d; K4 h
a( U+ k( v6 G& \% R3 h //Method - 2 N=100000 237s
1 O* I$ q- h3 A2 F# U /*" J5 y" ^3 i" j. e. x: P/ S
for (int jj = 0; jj < N ; jj++)) S8 @- E! g' K9 g/ ~" y
{
x8 d' ~: d' X) @ fresult += vec1[jj] * vec2[jj];
3 g" P9 U; S8 E; }2 B" @ }
, K2 |! d; P- ]. @. f+ U3 T */
( m: f( C- j: c+ L8 | q
7 V/ }2 r! S4 V) O' C) J //Method - 3 N=100000 204s9 O4 o* X! |+ |1 N. e
/*
+ t( Q. L& P- z @& w. L+ \# u for (int jj = 0; jj < N; jj++)
, |2 _6 R0 p, [/ l {
- M4 x& D) S3 b3 s fresult += b1[jj] * b2[jj];
( j: d' I B) c8 L }" _' b; F6 `. v6 X( G) L
*/
9 A* K! d5 H0 C8 l! x6 p6 p0 C# I5 {5 i" B
//Method - 4 202s' U1 Z: A, `! ~; V" u2 K) v B% W
/*
% E! ~* D8 }% ~ for (int jj = 0; jj < N; jj++)
( L7 F1 a7 |. `" f* j5 t) V {
2 m- j% |. }( q+ W : B' L- x0 o4 P
}6 a# L2 f8 s& `. W
*/8 |7 a, }9 k2 W6 J
//comment out all methods, N=100000 202s
, U3 @* T6 G* u8 Q& ^! ^* C5 _3 { }
8 q" |$ I2 \* W$ T5 W* Q0 [8 T; I% k- a! t0 R5 g M, P
delete []b1;
" e) b% d& _/ a* v2 j" e delete []b2; 8 X7 G' A2 q3 [. v
|
|