TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 a( V/ |( Y% M4 _' R. w
, V( l# i$ P, h8 }( o理了理思路,重新做了一个测试。
0 {. [7 K' c" w" [- }做了两个 vector 和 两个 float *, 都长 100000
: P& J* ?8 ]) j b: _外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.) }$ H6 i; x9 A/ b8 s( E' P
0 S2 _ y2 u% i6 V2 x! N2 d" i7 h
内循环试了4种方法,- F7 B6 L) h9 y. m- x/ J. V
1. 直接调用 vector inner_product 247s * B4 x( j# r7 E) g% N6 E4 |
2. vector 循环点乘累加 237s
% F; g. A& \& g& s/ F: { |- w3. float * 循环点乘累加 204s
+ N6 C! S$ @- @2 t, C' [4. 空循环 100000 次 202s
, M- U" _0 J+ n( `* ?$ o8 {" E: ]. d
8 A4 P& h( @- U% A3 Y不做内循环 200s
, ?% T" X! r9 M7 ]' y. c: k
- R5 i0 S7 z$ j' N# t# C! e$ j你昨天说的对,内循环本身占比是很小的,大头在其他处理。0 L2 x4 h* N' y- I; d0 H1 F' N
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 d( T/ h$ y* C( Y: N# [4 [
7 _3 X9 U& v8 ], s. H) A( L
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)0 y8 R* `/ R! ]4 x
& ?: k6 S- S0 V0 I& m- @(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)5 _7 \# `- o2 d2 E I
+ v) G, |# i8 W std::vector < float > vec1(N);
/ ~& q+ X. K" Z7 h8 H; n$ p% N std::vector < float > vec2(N);6 f9 F- O& Q2 W! t' k
float* b1 = new float[N];2 |" Z7 p% L1 l0 i4 E
float* b2 = new float[N];) @3 U# q# g: z
+ G/ N- J+ X% D
for (int j = 0; j < 6000; j++); ~8 P9 T/ ]0 v6 B; [* P3 e: B+ }
{
+ X0 Z- f& y0 }: _& K std::generate(vec1.begin(), vec1.end(), []() {" C7 I$ z/ k7 ^1 \" A2 h
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;; Y& s" _1 b! n2 f1 F
});
( b6 e7 ]/ ]. X& a; n6 O) l; Q( l0 N8 b
std::generate(vec2.begin(), vec2.end(), []() {) q" S% G, s7 o! \& y R, C
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
1 Z1 l: X+ X0 v5 t; q& n! y- |$ A });) E+ \$ N- h9 K* f
8 ^/ a+ f1 i1 j1 k/ H7 | for (size_t jj = 0; jj < vec1.size(); jj++)
9 ]0 z0 h3 O0 G' l- v/ U {
$ w2 H9 _2 }6 d3 p8 [" [1 n b1[jj] = vec1[jj];
; @$ Y; N) V3 ~ }: m7 a6 t9 N' J
# v# `! S a* I% C' \" ~
for (size_t jj = 0; jj < vec2.size(); jj++)2 Z' ~' t% C( t, r0 j5 o4 P, o
{ Y: E3 W8 J6 W5 X! L( o9 m! C
b2[jj] = vec2[jj];
; K3 n% D7 r- j* R' E6 p: x+ @ w }
: F- x9 C( k j* r. F1 j& ]6 a" d4 L& y1 W. X
//Method - 1 N=100000 247s
) I, z9 b7 f s6 G* c. J1 k2 b //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. [! E5 U6 u8 m; ^& u0 d8 l3 C; l
( Z- b0 J! C9 P: J) u; U! v
//Method - 2 N=100000 237s4 Y" \4 u7 E) Z, e3 s! N! X8 I' M1 ~
/*
1 n6 z2 N. L$ I3 p! S for (int jj = 0; jj < N ; jj++)
' q A3 D8 u M- o {
/ A$ ~ u' l( Z4 f fresult += vec1[jj] * vec2[jj];% H6 j$ ~7 T) k1 }
}0 J- Q$ ?8 h- Y. B1 D7 K7 {
*/" R7 O- z( |+ r# c$ x
" {' v4 ^% m, o! E- A //Method - 3 N=100000 204s
Y# q1 u1 X. o' _) p. t1 D6 `& X /*: U' `1 S1 N% X/ h* b
for (int jj = 0; jj < N; jj++)5 R9 R9 v) ]" r
{0 Q; }& I( m( _ N$ }2 o; w
fresult += b1[jj] * b2[jj];2 [% R' }- x+ w6 i4 T$ n
}
! s0 c0 \! p0 U/ q/ \$ R$ _: s */
5 x. z y7 V: k4 H! ?" S5 X3 T9 O* k' [( B$ h+ R2 Z, v7 N
//Method - 4 202s
/ H' L+ t. B; l c. u2 R* w, g- v /*
5 V1 L( Y! I& N. ^6 G9 B for (int jj = 0; jj < N; jj++)
- [8 ^3 \, G# T3 V ~0 A d {
8 e; Q* v- b. W
9 Q) j" O1 m' T: G+ H }
; d9 D) B8 C* @- t; l */
" o( ]; J4 ^9 t6 N: b9 [ //comment out all methods, N=100000 202s : v" @5 t0 k& c( b. e4 \* x
}, n( L6 F) Y) @$ W4 e
2 ^, h7 E5 ~& P
delete []b1;
9 [$ }" S; O. `* O$ d$ x- x; r delete []b2;
) N& B: E$ k) |: u |
|