TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 " \* B `/ E% ]/ d4 R' _1 D
( f5 b. i8 {8 o5 w A% W; |1 K
理了理思路,重新做了一个测试。
4 `% U2 t1 b" J h% m做了两个 vector 和 两个 float *, 都长 100000
; ~* Y$ P' P. |5 U x" i1 M" w2 f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
4 t; T3 s% `, c( V) |' |) C. r
7 G: U4 l! @2 K. n内循环试了4种方法,1 R+ i- C; V: N" T9 e' `# M
1. 直接调用 vector inner_product 247s - B/ H' ~" E% z# c$ u! _
2. vector 循环点乘累加 237s
: J% \' X' W7 N! G* D3. float * 循环点乘累加 204s
/ |5 ?: \+ v* d4. 空循环 100000 次 202s
/ p n3 j# X' M+ d% F1 k, {2 b2 n, `' I- `7 m7 A' R
不做内循环 200s% f4 w) u4 e+ |. j4 [' P* d
: N' X! n& i" ^2 Y( M* l) `你昨天说的对,内循环本身占比是很小的,大头在其他处理。
) B2 L% `/ u5 e$ L! L另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 I" N3 K& l8 p
& d& V2 Y& l6 o* l! d" k7 y
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). B& V7 L: {) W
+ ?0 w' l) s& Z: g1 g% u
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)% P" B; A; Y1 o" j, v( `
, x9 M0 w, q k8 z# @
std::vector < float > vec1(N);$ N$ k1 \, _, E' |& h& ^' `3 t) }
std::vector < float > vec2(N);
* X3 @! D0 l( U, Z+ d float* b1 = new float[N];0 H! d& o7 D: m! o- q6 ^
float* b2 = new float[N];4 y( x' Q+ g( _
1 [7 s6 S1 w1 I4 L; x
for (int j = 0; j < 6000; j++): t' ]. _0 t @; t1 o N [
{5 X6 {: i+ P" V, G9 L; _8 c E
std::generate(vec1.begin(), vec1.end(), []() {5 x g8 u9 b9 W4 O% \. Y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
" \# {) Y5 X A: s) G( U });
) j& w* \; u+ P# F" ^6 u% o/ S% m' U0 P6 z$ [& _
std::generate(vec2.begin(), vec2.end(), []() {: j' K5 f( D3 Y0 A ]& `
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;/ r! R) e6 y8 U- y2 F7 @! d1 ^
});
' h* G7 i& _) k; s" t
7 W: e) h4 j/ d- s3 Z$ P% i' Q6 j for (size_t jj = 0; jj < vec1.size(); jj++)
) A6 x3 i8 Y/ r u {" e2 F; [/ j7 V5 |) S
b1[jj] = vec1[jj];3 P4 r) t* B' l* G% D
} d8 q [) N5 p; L# R
2 P3 K! Z0 [ A* b5 P0 c4 ~ for (size_t jj = 0; jj < vec2.size(); jj++)
6 H3 W i% q6 [' N1 @ {/ x5 z, `- E& w, y/ E0 @4 A1 z K
b2[jj] = vec2[jj];
, I3 z" {- z$ Y; f0 S( w6 {* o* i }
% `' @) ~9 C% q& T, _/ x# F" D: w2 G" C8 Q
//Method - 1 N=100000 247s u J4 G+ P }0 @3 t0 e
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);5 H+ W, G5 f2 Q( p
$ C9 {4 W$ @+ L //Method - 2 N=100000 237s
$ Z) r! t# y8 X' y /*
/ w- k0 P k4 R2 C9 @# X' p w/ t for (int jj = 0; jj < N ; jj++)! T+ j6 U S0 V) O/ O& p
{
- F- m Q. ]+ [ fresult += vec1[jj] * vec2[jj];
/ T( }( e: u+ V& C0 |0 n5 U }) J4 C3 K% ?# c' c& O. p
*/7 d" ?* E+ _8 d
7 W% p4 R, B7 E# f1 |% H
//Method - 3 N=100000 204s. x- |: ~7 N; H& I# H
/*# ]( f4 S4 @4 W7 j- ^
for (int jj = 0; jj < N; jj++)
( w. o. X' h8 C {
* F7 v, u- | l& P- T% h8 `( t F fresult += b1[jj] * b2[jj];
: s" j9 [- d% o6 R' L }
* j0 |4 ]$ K, ?1 ]) Y8 ? */
- {. |* x" `( G5 e7 O
' P; b9 t+ w) F6 m$ L3 b* k //Method - 4 202s
7 m k' Q9 W2 ~ /*
# d* H d& |+ {0 @ for (int jj = 0; jj < N; jj++)
. R7 i4 ^* @3 H$ @6 x/ L% M {
8 p5 v7 _: S: o4 ` 6 d$ q# {2 \/ E3 R, k4 m' _. K4 i
}0 E; X! ^5 v# l* j+ J, @* o
*/
9 y& k. b6 c C& E; a- s, x9 T, D //comment out all methods, N=100000 202s
; s* @' B& S1 ]# O- Q/ p }$ ^* B6 ?/ O8 |
& {& D: D9 `% Y% D8 M
delete []b1;
/ k5 g) |9 z: j& i$ @* G+ F7 K delete []b2;
# j% {' B5 ^* X. q( h |
|