TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
( L9 K* V' `. J! R& K% y$ ]! I9 K) o' p) X
理了理思路,重新做了一个测试。
$ G: t6 T a9 R6 P: x做了两个 vector 和 两个 float *, 都长 100000
. d. f9 G9 w7 [, \3 S0 z5 R外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' c$ M# E' ~& m% t
* `! i. x' G. o- E1 x内循环试了4种方法,+ G/ z0 v3 a- h
1. 直接调用 vector inner_product 247s
' V3 I! s; t& M8 _: Q7 ^2. vector 循环点乘累加 237s
- a3 e* F% O; X) n+ G7 [; x! [6 g4 \3. float * 循环点乘累加 204s
( U" z. I0 s- }) K4. 空循环 100000 次 202s9 z" H9 \# J, x- b" [& F0 q1 W
, f2 p) Q) P0 ]. {+ Z/ f% F$ t' N不做内循环 200s
0 A& n7 J4 }1 n. e! g2 H2 ^4 x0 ?; ?5 q' D7 t3 H" h
你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 y7 \4 X0 F( q! |( B7 T5 r
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
7 N; m0 [* n9 K- [' g! f3 s& Z# {/ l/ X
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ z4 ^/ D' d% x
6 ^; w j; S1 k4 p1 }. }; a$ l(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)& P) Q/ K: P6 ?: p6 Y# F% Z, P
0 U+ {% ~% T1 b; O5 L" {% p% O
std::vector < float > vec1(N);
8 _, C7 ^0 K4 F* \7 X' a; m) e std::vector < float > vec2(N);
; b9 V4 t) W6 E float* b1 = new float[N];: z+ W3 W G+ e8 g
float* b2 = new float[N];. ^3 x. a0 p$ N* K! A% w
/ k7 {/ t0 ]( {% c# o
for (int j = 0; j < 6000; j++)# d" Y. k5 Q# f T; \
{
, [- b7 _$ q. J, Y* {+ o& T std::generate(vec1.begin(), vec1.end(), []() {
$ x- [/ h x& w5 N6 F& f J1 @' S- ~ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 n2 X, x, i0 Q, o% C3 }6 E+ g
}); n# b( J- ^1 b0 d% J# i
J3 q' C p2 Y$ `
std::generate(vec2.begin(), vec2.end(), []() {" C J' F) |+ p/ [. w2 k$ N( `
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 p* }# y: p+ X, u7 V- l" [ j: S });, l3 E" Y- L" T3 l, f3 I: Y
9 {2 L# i" O$ y0 q, F' B
for (size_t jj = 0; jj < vec1.size(); jj++)8 s5 w6 v5 x6 S2 J
{
, |: y# O/ z/ s# W8 R& K$ A b1[jj] = vec1[jj];
; D" l: {- y: T0 Z7 ^2 [ }
- `) k8 V8 |+ e6 O" q$ x, G" @1 C+ E+ [0 X' K/ P. ?8 q0 z
for (size_t jj = 0; jj < vec2.size(); jj++)$ o; n$ c5 J+ X% R) q5 ^# N/ s- t( @
{
4 U( w* ]6 o5 O+ L0 D b2[jj] = vec2[jj];+ v" i. @1 m, ^2 H. j2 d9 @0 u
}2 x* N) u. `' e) k3 q
1 k/ e3 ~9 Y/ o R- h7 E) n3 w) @
//Method - 1 N=100000 247s 2 l# N: t* U7 O# K" y
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);- g6 `# T; h% v) d& {0 C
0 _" R8 F6 Z( p6 b# C1 u //Method - 2 N=100000 237s9 i' w8 _: ?. _5 |5 _/ U
/** ?5 }3 N) c. v
for (int jj = 0; jj < N ; jj++)
/ y1 @- S7 |% r8 t! i {' J" T; c/ G" F' U8 @8 T3 m5 V
fresult += vec1[jj] * vec2[jj];
6 B& d# N& X! _/ X5 F( v }
0 ?& N! j7 n, ?* ~" G; k( o; R */
: V& K) r3 Z) b" m# C
" b9 v! ~1 z( g8 `: n //Method - 3 N=100000 204s
0 @- n+ s* r* h6 ? /*6 q' v. n& P- R: h- o x
for (int jj = 0; jj < N; jj++)
0 f# {% O. g4 B/ T {
8 W. j; }( p5 A2 ], h8 D q9 Z fresult += b1[jj] * b2[jj];
+ t9 t* N$ B( J% K5 ?0 r }
9 u4 h. i6 Y, a: d3 j */8 O* h% G0 q3 b8 A, N' K
: U, ]/ b: I9 W1 \4 C5 `/ T
//Method - 4 202s
5 H& o6 I$ @2 p0 N /*
" ]: i. n; b7 A- u for (int jj = 0; jj < N; jj++)
1 w; h, t g) R7 y% ]5 R {
, b4 l5 o! v% F" O! G ! u E/ q+ M3 E. m/ {8 H1 _7 {
}: ?! U" e6 M7 ?0 J/ }
*/
, }* W l% n0 r! a1 w% F9 J# n //comment out all methods, N=100000 202s ! d2 H5 G; p/ |. I
}$ T$ L# R$ \5 E
( [, [: ^# y. I8 l$ K% O6 i% ^ delete []b1;
% C& p+ d; o7 @/ C# @ delete []b2; $ ]$ P+ \/ z8 | U6 M
|
|