TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
6 f1 ]4 l: C. h; T
' g S& [2 U9 d, X8 P: R' G理了理思路,重新做了一个测试。' u* `/ E0 M) a5 d) c4 f- A& M
做了两个 vector 和 两个 float *, 都长 100000. c( `" _& D7 x" [* W/ @
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
9 R* h. j1 q, ~$ T
& |% ~! n+ T) p* s, v6 a内循环试了4种方法,
* F: q; ~0 I+ T j) [1. 直接调用 vector inner_product 247s
# |9 C- P8 J4 h3 S$ O: m k' b2. vector 循环点乘累加 237s4 H! v: A5 Y! _' z
3. float * 循环点乘累加 204s
$ V* e( w' t5 e, ^4. 空循环 100000 次 202s- g& ?7 |* Y4 b
& I, k+ ~5 z/ O4 e* v& ?( t$ ?
不做内循环 200s
4 q9 K e o9 C* q7 ~
Z: \$ e5 d; N ^* u4 K7 m你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 p& k9 C9 J7 a1 }# g
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 r U+ S' _2 ^! `6 F* x3 z4 [: B/ h
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
0 x5 _9 G! d. ~8 d* }3 P& b; E* [( M& Z# M; U
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)$ A3 w( P5 @ g! U+ _
7 R6 K- L7 f) {+ d
std::vector < float > vec1(N);1 G! L" R: P. b
std::vector < float > vec2(N);
: i8 n: L/ ~0 `% k/ Y! M2 p float* b1 = new float[N];4 q- V, E( T0 d/ Y7 v
float* b2 = new float[N];, s1 I2 @" h) `+ |4 p# q' a
4 ^7 }! w+ D) _+ h6 P# V for (int j = 0; j < 6000; j++). V6 c8 z0 P& h' e, N
{4 N7 P1 n7 n3 K" B, l6 \
std::generate(vec1.begin(), vec1.end(), []() {% ^- d- s3 L: s3 V
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ x& c2 O8 h" B0 J' @ D' _. c
});# x* ?3 ^' {# W. D) i3 [; j d
4 P- O3 j, g, q& ]) t: v( f! X7 d std::generate(vec2.begin(), vec2.end(), []() {
6 M* \$ i2 S# H* X8 k3 I return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
4 C b( M% p" _) y1 T& l# J* ] });! G/ q2 A3 C+ c& ?' [" N) j
$ {9 }7 L' x) W- Z& D# a6 K4 q
for (size_t jj = 0; jj < vec1.size(); jj++)5 G1 S* J0 M8 y5 c$ c
{, `0 J! o" W `& ?4 X- W
b1[jj] = vec1[jj];
+ Z/ L6 |- Q5 z% z+ H1 q' e7 F }
( y: m4 G9 Y m+ Q' |: r; }# ~) S6 z! i" z# q6 j$ o
for (size_t jj = 0; jj < vec2.size(); jj++)2 d- @5 I( p( R; Y# G
{2 V5 F$ R, E/ ~: ^4 Y( P: R
b2[jj] = vec2[jj];( u' E7 F z# r' a' L
}
d% b7 L' O! N: T
" P" ~) M1 w/ M6 ^' N //Method - 1 N=100000 247s 7 ~8 M: o1 {! d) {
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
' P4 V0 T1 ^, r( P: V6 Y $ e: a `& l% j, }- S8 i
//Method - 2 N=100000 237s
W5 H) A! G: X% k% G v /*
5 _) c; d I! R0 e' b, { for (int jj = 0; jj < N ; jj++)
) n w3 U, V8 Z& ?, |, |" s {
y4 J" R" ]# L0 o$ G fresult += vec1[jj] * vec2[jj];! F" P% Y: f+ g9 x1 \
}
2 i: \" I3 o6 I1 _ W. A Y */- h2 t" X2 k. x4 t8 n; x. R$ K
7 v h3 a. M1 G //Method - 3 N=100000 204s
" l( I$ L% n$ C2 A& p /*
) v# y. k& {) b+ | for (int jj = 0; jj < N; jj++)% b1 U# U) t9 a8 ~
{( s& h# E2 ^$ k2 J/ v
fresult += b1[jj] * b2[jj];
- t ` u; S$ U0 f* H+ i }
6 X" @/ d# t- k+ |8 ~ */
4 u0 r4 L4 k* i) t' l3 L4 ^ @: o: I, Q( i; _7 `! p. f& h4 X' R- o
//Method - 4 202s
S$ d9 [9 d1 b /*
5 J- O4 I* ~. U) s4 l# W# i for (int jj = 0; jj < N; jj++)
; e! e0 t% w* Q# u" G5 l5 I {
; w) c* a% `4 \6 \) I. k 3 q: ]) |& }( Y3 u1 v L( O6 t
}
& N% n) h: \! D# `' V8 Q: A! ]7 H */) b$ F! P8 \* Q1 X. w/ k
//comment out all methods, N=100000 202s 6 r& [% x3 s" P: D) i, ^+ _; R
}- J0 e5 J$ g& m7 \( ?
% N) f& r! ` K' q delete []b1;9 U/ \# p3 r- L! R. N/ {( p1 ?
delete []b2; 5 P+ R. y+ L; _% m* T, {6 N
|
|