TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 & }# T$ \; Z) ?" T
) ?9 d* f4 {& ^. y# Z6 z% d理了理思路,重新做了一个测试。0 W, k! M. ]* l! t0 X" q
做了两个 vector 和 两个 float *, 都长 1000001 q6 N( h5 O9 Q* U
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
Y7 F/ |4 B1 D" T; \: @
* [8 P' x+ l' R* n$ J内循环试了4种方法,7 Y# y3 N6 Q& D' @/ S6 D5 K
1. 直接调用 vector inner_product 247s ! s1 |; v+ y. M$ C
2. vector 循环点乘累加 237s3 j g% N7 T6 ]( q, F) Z
3. float * 循环点乘累加 204s# [. F& _4 u6 f! d
4. 空循环 100000 次 202s, V, ?; D3 A( U& @' T
5 P# e% g D, y3 @* |5 N0 c+ H
不做内循环 200s
. |8 ]" n" Z: p" @; z9 g8 n; c( F
你昨天说的对,内循环本身占比是很小的,大头在其他处理。' Q ?0 D9 B9 ~* Z; v
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ Q! ?# m0 s& ^( ^8 ]/ P8 ?# \
8 v( W" a7 I2 h: G/ z/ z' N+ q: a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)' O* l; D% ]) u8 i5 a
( F/ E; n2 l4 `
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
4 e$ B# q1 j Q
+ X- p% z6 M" O4 t" [ | std::vector < float > vec1(N);$ G" T* F6 @2 \( W
std::vector < float > vec2(N);; H# }- l( U M+ N
float* b1 = new float[N];
/ c/ t+ R' N( c float* b2 = new float[N];+ b( @7 P/ I9 R y
/ i- [ t( F$ P! r+ d for (int j = 0; j < 6000; j++)
* l! s$ _7 N8 @* ?5 S# x% e! F2 Q5 i" n {5 [, q* H, e; m2 A W j; O/ c+ j
std::generate(vec1.begin(), vec1.end(), []() {$ D# n3 O% Z8 R7 i5 H: I
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% k; u# F5 n+ f$ `) s9 Y" T- Q; l$ t! i
});
}, c) s0 u, o, L
2 ^8 L, z2 ] ?$ J) U% o& Y std::generate(vec2.begin(), vec2.end(), []() {
7 Q* \8 U+ ^9 A! s5 B; i return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;( v* e# G! y& \* N3 R7 \" t) D4 O% w- B
});7 n7 F4 i7 F, r+ ]8 {0 ?
4 w4 q; V6 r3 h( G) b5 w/ {0 Q for (size_t jj = 0; jj < vec1.size(); jj++)
! I8 M1 j1 R1 @, P, z0 D! B+ X# |6 f) \ {
, N( E) o" H6 g. {( S$ [ b1[jj] = vec1[jj];8 s/ s f8 |: e+ r! H, ]) N8 k
}6 j e- h1 G5 J0 E0 s
! u v% g. J3 S: v0 ]) [* o for (size_t jj = 0; jj < vec2.size(); jj++)! a. g- g3 }) S X7 ?; A" _5 Y8 k
{& s8 a: f# p* P& W+ b2 V; E
b2[jj] = vec2[jj];9 X0 _6 f! p" Z; b: M( y
}
/ X: q) V' v* A9 [; J8 J; I- p& E; J
//Method - 1 N=100000 247s ' W I8 z' y' \9 M
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. [& _: |; }& {7 s8 T
& N3 S* d7 d5 Q# T9 c //Method - 2 N=100000 237s1 }7 r+ C- ~. N& V# \9 K, C
/*
7 I0 t: j5 o6 {# Q" z( E for (int jj = 0; jj < N ; jj++)- H$ e3 A( p. X4 X6 t/ c
{5 l. H0 z& s% E% ?; V
fresult += vec1[jj] * vec2[jj];
6 R, r+ t z; G2 X2 ?4 ] }
7 R1 n! t! n ?6 D% c. D7 j */! E; ~7 w& ?# N$ J
) `" k B7 @& R5 R! G9 n //Method - 3 N=100000 204s7 \ D# X2 c' V8 L* L9 i; T
/*
8 m( R( X9 G% I9 }( ~6 j/ ? h# o- j for (int jj = 0; jj < N; jj++)
* }8 S( |" `* Y! N; S/ g, V S {: h- v1 P1 V. v* c- \
fresult += b1[jj] * b2[jj];
; f# ^: e! e/ i: i* I7 Y }3 _' C. Q! A8 S& q5 [3 r
*/
U- b5 Y% k3 o# @# k5 H/ [. R7 [; Q: o$ u% m/ W$ H% Y" @* ~
//Method - 4 202s
" w B) J% N0 G' Y /*7 ~/ R" {: i; T8 @1 B" I
for (int jj = 0; jj < N; jj++)5 p6 n1 E! I. I( H% l. e8 e
{
1 \$ o4 h& k9 j+ k, t, ^) e / }, U8 I& y7 X/ x5 E! D
}
4 [7 R9 J* i: ^3 n: i */' Y' l! j* D) T" x- x
//comment out all methods, N=100000 202s ' w! _1 _- [$ a. B; w* s3 M
}8 i2 F2 r! |+ w: m
/ O. n: q( r6 _; _- h, H) w
delete []b1;3 T0 L! _0 X% U$ P1 d" p- W9 H( B
delete []b2; - M, p5 b1 B- A
|
|