TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
; }2 G. I* d; s0 y3 O; n, g$ ^+ m
理了理思路,重新做了一个测试。" c9 w; J% S' W ^6 p
做了两个 vector 和 两个 float *, 都长 100000 f0 }0 D: r' e' e7 l
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.% |# Y9 K: @1 {/ o: T7 P0 [3 D" w
, L9 c( \! f+ K% g内循环试了4种方法,
. N& I) q. m# u1. 直接调用 vector inner_product 247s
/ x9 e* j) t2 S2 U. ^2. vector 循环点乘累加 237s
+ I3 D: B8 K- w8 F! t; V! `: n3. float * 循环点乘累加 204s: i4 p1 `. X7 }1 p
4. 空循环 100000 次 202s
- R4 T7 b1 L2 D5 z
2 `" F3 i/ @; F& N! {不做内循环 200s& L. [; }) w: V7 ^% [9 j- z3 i
. P+ w# n4 g8 F- h* j0 R# L- T
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
9 u5 ]0 I9 q/ w& y2 r, ~另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
! e x4 g1 x+ j4 g6 F: [
. m; P$ V$ [; V( H4 T1 |至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
5 l. E+ W1 c4 |+ ^9 M5 H. c9 b6 `8 G6 h+ R, E1 U; H! R
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL). t; l; _ W; b- N
* Q" a0 d$ W9 ~+ `8 o std::vector < float > vec1(N);
9 E9 P! y& D" ^+ N! G1 k. I+ ` std::vector < float > vec2(N);
9 w& K# R K# S6 u( @ float* b1 = new float[N];
6 i" y# g+ l7 j3 s5 _$ i) q; W float* b2 = new float[N];8 e$ V- y8 B! ]6 [; m/ @) b
' ^- t! R* U: b! C- _ for (int j = 0; j < 6000; j++)
& p+ ^. d2 C6 L. u. ~5 [ {0 _3 K9 B' c4 Z! ^+ X: c
std::generate(vec1.begin(), vec1.end(), []() {
6 `, z- _) }) A1 | return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
% E3 J: }/ b, i0 F% v R });5 W. S6 v6 w# ^5 j) T
& j9 S1 \ |8 x9 ] std::generate(vec2.begin(), vec2.end(), []() {* e& w/ `& P5 k# r6 B
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
# p. M4 M7 n) S& _+ l/ c });2 X2 q/ A' c3 m* Y$ T& i) d& T3 H
8 C3 d; u* n U# q5 w$ H, v' _1 r for (size_t jj = 0; jj < vec1.size(); jj++)
) c$ K- f3 Y: E. B {
* k, s6 v) u4 N; r1 a" ] b1[jj] = vec1[jj];+ L8 e; K0 @0 k- _
}
7 d; b W+ ?+ ~+ T9 \/ ]% Y
/ b" H5 b' e) ^' Y9 a1 Y for (size_t jj = 0; jj < vec2.size(); jj++)4 I/ S; C! K$ b7 _
{% W4 R' X2 r, N6 F3 l& y( |: I
b2[jj] = vec2[jj];$ A# J: c2 V, [$ m& c7 f7 z7 X8 Z/ ]
}" D, W# U+ A" ? ~
9 U$ ^& t' w: ]+ L" v( i/ b4 h, B2 R //Method - 1 N=100000 247s 4 y( A; Y8 T; T9 L, g" p& t3 I
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);' I7 `+ _% j% d# E8 A
8 b7 B6 t2 {' V: G1 ?2 @* y9 n6 j
//Method - 2 N=100000 237s
w( P" c" u! x5 h9 A% `( I /*$ v# J/ i4 i( m. K5 z
for (int jj = 0; jj < N ; jj++)1 n& w. x* K; g9 p8 _5 n; X, q
{7 j, }. P O1 k) |, p5 g+ _, T
fresult += vec1[jj] * vec2[jj];& M& x6 q2 p% J$ I: }' q" V8 b5 }
}
: C% ~; i, y T; s$ a; c */: v& X: p- J* Q( S# h6 N0 F# `
7 j! u/ D \0 V, f8 ^% {2 m+ c //Method - 3 N=100000 204s( e8 g3 `6 L2 l7 F% J8 {6 j& z
/*
7 C7 J: P0 p6 S' Y for (int jj = 0; jj < N; jj++)# R! a q1 y2 j# ?3 y6 r3 Y
{
5 T! x: }( i+ L# i) M fresult += b1[jj] * b2[jj];
' G. O; z+ a- ~- h) d: v# G Q' h5 x# s }+ s! t, n( w; O' r4 A. M' @
*/; L( B$ w# B0 C! o5 B
4 V% s% |& w; H; F8 ~
//Method - 4 202s
: I# o! r: v o( L- ~) L) _+ E /*
. h: l$ P* q9 f- O for (int jj = 0; jj < N; jj++)
) ?2 M5 \! U- n$ Q3 W {
; F3 V+ y) `2 L' O) m & S( ?2 c+ a- @2 e6 ^: w5 t8 C
}3 o$ M/ p7 \5 _- \7 U ~. s
*/- E7 b8 b! V6 P% X
//comment out all methods, N=100000 202s
3 ?" f" \+ t; N9 A6 V }
) o" N' i* ]/ q2 \3 t/ J, n# e' |" m8 t" K% w W9 |" E; L
delete []b1;
+ \* g5 J' d6 T- x# u) O delete []b2;
% j5 x3 Z( l4 O/ Z6 ?0 V+ Y |
|