TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! H: c3 \1 a Z. J! T$ f+ k" j
: w" A2 g! _0 M: |3 p! h9 I
理了理思路,重新做了一个测试。
, ^* Q8 I) c* \; Q, W做了两个 vector 和 两个 float *, 都长 1000002 j. l4 ? B5 @- t! x! } i
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' P- T/ p* p0 T6 |
v5 ?5 C7 t* Y* @; I" b: a4 {内循环试了4种方法,
; Y2 x d# G" l, t# @1. 直接调用 vector inner_product 247s
# ?8 H4 U' i q* G2. vector 循环点乘累加 237s
F7 o. ^- Y% z, t# G/ \3. float * 循环点乘累加 204s
4 E& ?/ G/ s6 r$ q/ A4. 空循环 100000 次 202s
2 L: O% I& f$ `8 _7 S, L9 S
- b1 T- k1 `9 `% D不做内循环 200s
3 W) j* [3 k% {- h3 }7 a. R! j; g; a- z0 Z* ~1 }! p5 H6 F( K
你昨天说的对,内循环本身占比是很小的,大头在其他处理。& }2 z; x8 J! D+ \/ z. y
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
9 B6 U* t, ?$ r% }
C9 S3 \- [3 i9 y至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
1 ]6 a/ k6 Y4 e7 E5 _: k @+ Z0 a. ? Z/ }9 w# ~) `
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
# e; k) q& z4 g8 }& I; L2 t3 Y" _& L4 l
std::vector < float > vec1(N);
' x0 {3 I' T/ Z* b- w' y std::vector < float > vec2(N);
5 ?! O) w& F: [) k1 E' Z float* b1 = new float[N];
8 Z- H6 @9 |# X float* b2 = new float[N];
" q: D) J; J" z( T, i4 M" t1 ` O
8 I @0 T% m2 G0 J for (int j = 0; j < 6000; j++)
6 b! a4 K- I7 n" B {; Q( z, e! C) d4 d
std::generate(vec1.begin(), vec1.end(), []() { d3 g0 K, D( b
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ ]8 a6 D0 ?, | });
" ~- S$ b3 ~1 @
: B5 I2 P( o8 u. s std::generate(vec2.begin(), vec2.end(), []() {
* c' L; \! }" j$ Q1 F return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
' o6 y& t7 ]3 T" J$ I8 G });* p, n; n; n& z$ V% Z, J! B
4 }% m7 ^1 P, q7 @ for (size_t jj = 0; jj < vec1.size(); jj++)
( a; K+ W; [! U {
0 W1 k, y/ m. K m b1[jj] = vec1[jj];( H, V+ b8 Y2 j- f9 q4 V& z
}
( W3 L6 M1 m( u# P5 v$ T9 P% X) D) d, n% J4 B& c5 J! I
for (size_t jj = 0; jj < vec2.size(); jj++)
) m7 l* g! ]% s; J' N {5 B% J' O# M2 }( h' i4 Z
b2[jj] = vec2[jj];
, L y; j+ f, }" N ^( k }
0 {( }! D, {4 S# Y/ y0 @; P% X
7 D- q+ z9 k6 A: m9 @' Y# m //Method - 1 N=100000 247s 8 |# x/ N' {% A j. A
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
% a* t- L- L: W& T+ y: h- w
m2 J/ l; u% q3 |* t8 r" `0 o6 E6 t //Method - 2 N=100000 237s* [" A' ~9 Q( X- r# \! W# U" i
/*# e% Q4 C q! b5 S$ H# U2 n6 Z
for (int jj = 0; jj < N ; jj++)
, j+ m6 B# R1 R {6 ]+ O6 G2 | Q* t; i& q3 {
fresult += vec1[jj] * vec2[jj];0 ` p* G4 z3 U" m- e
}
7 y0 C) o3 H# _& J& ~. q M; G- Z% R */( k$ t8 \1 y) x: Z" r
, Z! \9 q; R0 l% } //Method - 3 N=100000 204s V5 {* v: Q$ h$ t7 c, @$ ~( V
/*
! c3 }( B% l* a, a& o! f for (int jj = 0; jj < N; jj++)7 \' V! o- f r8 t5 |# V: s
{
/ R/ t& V8 \- g, f' y5 c" y7 N# { fresult += b1[jj] * b2[jj];
) v7 T5 r. d/ d }
0 F" K7 {1 s- c; F */
; J; z0 C6 F/ R5 u+ g( Y+ g# ~6 v9 I5 k
//Method - 4 202s
$ G9 }% Y2 H4 E1 j* @/ } /*. _. E5 C: K9 Z" h! ]( [# Z+ p0 b8 c
for (int jj = 0; jj < N; jj++)2 f$ a& u# j* z& g
{; ^. O- V8 n% X- r
" A: q: m! u% G0 o& n }
1 P2 p+ T- z2 b# s- n3 P( |, I. e */$ p; |4 P% C, M" i& D
//comment out all methods, N=100000 202s ) @3 K" C" M* S N* i( i+ u
}
# e! M7 R6 d, r# F% ^/ W
. |1 g c0 A a! a" h delete []b1;
8 _: V' R3 Q& O, ]5 o/ ]& b. H delete []b2; 0 J- E) e: X; E2 o2 K
|
|