TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* ]0 u7 X% x( ^1 O: ?5 n# P+ F; |9 P- X" a
理了理思路,重新做了一个测试。
. G) R: S& V6 H2 M* e) H' O做了两个 vector 和 两个 float *, 都长 100000
( {% \# Z% ~' S' t; k: {+ @( A j外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 q, I% S' ~+ a' t- g9 s1 J
$ {% o/ P9 }, f& x' G4 U1 ]# z( t
内循环试了4种方法," t/ R- ?2 _0 S# T1 p6 |# ?& a
1. 直接调用 vector inner_product 247s 9 C7 G! k# D" i
2. vector 循环点乘累加 237s( t2 c& N E6 N' t$ a8 j& N @
3. float * 循环点乘累加 204s: ^' q* L; s0 r6 K q
4. 空循环 100000 次 202s
) l4 }' M' k U, p2 D
$ _$ C* B' I/ ^3 n+ a不做内循环 200s; d4 d4 k; `8 D: s# W6 l F
: q/ R0 n6 V E* }' [; S你昨天说的对,内循环本身占比是很小的,大头在其他处理。& a+ m- f7 }% ]: P1 V& R( E' l
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。2 Z% F& D" K# ?, j: o2 I/ E k( c
# w* E: k) ^" v6 h5 v. c G1 L至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)% @3 ?# G1 G( [# j. o" B# M
+ n, u7 H* G5 o W- k4 o' g% O
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
" J! F1 w! z+ B! e9 r+ o e1 n& J) J2 F$ U5 y
std::vector < float > vec1(N);8 Q. K. p$ q! @, Q6 E2 y
std::vector < float > vec2(N);
* _1 e' n1 U/ C' { float* b1 = new float[N];, I; r; k- @7 L: h" F
float* b2 = new float[N];
- g8 U% W+ ~ K; y$ x9 ]6 K* K8 k, E6 E3 k; |! l& w
for (int j = 0; j < 6000; j++)
6 x6 S: D9 b3 X8 ] {
' K/ H4 h0 B9 Y$ f& v std::generate(vec1.begin(), vec1.end(), []() {
6 m ^/ t9 }% D- Z9 ~+ v return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" O% w, u- @! e6 s# a r2 Z
});7 l9 c. w6 L2 v" `) `
A* G! T% S& T$ h
std::generate(vec2.begin(), vec2.end(), []() {
|& `4 d+ W, N; i. E8 v( g( \2 O' }" V return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
, R Q# ~: `% L });
( Q: q) J' @) O+ L1 [8 d9 v0 V s, n- H0 m
for (size_t jj = 0; jj < vec1.size(); jj++)
$ n2 R7 k, F2 H+ }! j: f5 J: v% \& x {
' |" {6 y1 T( ]4 N; [. q# ? A b1[jj] = vec1[jj];
5 P1 [, d3 E& o; H/ X; F- B, I1 J }
# d T9 B% K4 h5 K
4 @$ V) J' O- @$ t, B! T for (size_t jj = 0; jj < vec2.size(); jj++)
# x0 U- ~$ r$ K$ g {; I: V2 w- E0 `
b2[jj] = vec2[jj];2 K6 |# |! M0 C/ j
}
1 e6 V# y4 v( M6 G" A' i, A2 m
: \+ s1 L' l& r+ E$ M //Method - 1 N=100000 247s ' O3 U! J& Z6 U2 P+ p
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);# W, L% s+ j" Q( \1 r* w8 w: z7 ~) B
0 P* z6 n& ]: J q- E+ R
//Method - 2 N=100000 237s' d" p" s& t% z/ c
/*: K) l7 |! V Z4 w9 G7 N, _
for (int jj = 0; jj < N ; jj++)
" o- H D$ D$ T" S1 T6 g1 A5 K {+ L0 \1 e0 a# b/ F8 U3 \
fresult += vec1[jj] * vec2[jj];
4 i6 k8 E2 W% S- b* Z. K/ p$ h- L }
- o6 u* R9 c3 G: O7 g1 n8 L- W& f */
& d0 J! e5 R( ?4 f. R% _1 O
/ l) N" Z' U: W) e0 O0 `: G //Method - 3 N=100000 204s
. ]+ w1 G0 ^$ X /*
( ^" m) N% r- a- s for (int jj = 0; jj < N; jj++)) L0 t. [) |% h$ L Y' I1 f3 n
{9 I/ t6 h( X# Z4 z' f
fresult += b1[jj] * b2[jj];/ Z1 t: K0 M+ F9 A- U
}
5 A! q) K8 u+ m1 z# a, s1 A */1 H0 J# ?* s0 U q) R/ }
# x& g* P# ~$ k6 H //Method - 4 202s7 t! _, q+ z7 j0 d! S
/* L; E" _0 z3 y$ j4 B0 p3 r
for (int jj = 0; jj < N; jj++)
+ ]* S% Q/ Y9 O- ~2 q {
( j& V$ A7 I* P. S/ [- \ . x5 m5 i1 n) F9 t1 C, _) O( d3 }
}
! \" N- u- D& v+ b */1 C5 e4 e% `/ v% E: ]4 i) M& ^
//comment out all methods, N=100000 202s ) H8 s: z3 J) M5 a6 }4 C2 ^! b
}
+ w- U( v- w9 s" Q
- S. d p1 u! h2 J9 F+ y# Z$ H3 x delete []b1;0 O# K( R1 O& l/ e* j; o: t
delete []b2; 7 r9 d5 m( b4 `: c; n: ]6 U% c% E
|
|