TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 , c8 d4 T* R+ o7 S6 J! H- h& h
3 q- v8 O" c, `3 R6 J- W) `1 _; p
理了理思路,重新做了一个测试。
: o$ Z- u$ K! g' j& H h+ R/ b" |做了两个 vector 和 两个 float *, 都长 100000 t: T1 F; `4 h1 A
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' B. c5 E4 O: B8 _# ^+ }5 ?! J, @( U( [- R( J* U0 N& M6 Y$ l( y
内循环试了4种方法,+ `$ ^: t& m, ]7 Y
1. 直接调用 vector inner_product 247s ) U1 p, `5 z, Z2 ~ J
2. vector 循环点乘累加 237s
1 A# w' j9 I; m# p3. float * 循环点乘累加 204s/ w, J; E; w6 M" r# w1 w j" C
4. 空循环 100000 次 202s
7 g9 v0 L% O; `4 I& |* g3 U+ f% R# ~! o+ `5 ^9 G
不做内循环 200s
, B' t+ j. f0 v9 K
6 n+ b# m: V! H1 z9 G- ?6 Y8 Z' A# X; G4 b你昨天说的对,内循环本身占比是很小的,大头在其他处理。
, e- a9 [" B$ Z( \: T ~另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
9 o# R" l% I; O D1 \) j' ]# c
: D! D! ^- S$ A# w/ o至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
9 d8 ]9 ]! @) z S' X/ x. a% Z# Z" x4 f( d; Y0 C7 q, T- A
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)/ p# V. r3 v# w
# }! s5 u6 l: o
std::vector < float > vec1(N);
% S5 N- a1 ^7 X+ X8 n A std::vector < float > vec2(N);6 x! p0 p% u* K/ Q/ j. S: |
float* b1 = new float[N];- m' s3 E# C- E( @, @; P5 T
float* b2 = new float[N];
. X! \% U1 d# t3 w& |, K1 k, s$ z# Y. G [" M
for (int j = 0; j < 6000; j++)
/ D z2 M& O1 k5 O& u/ k {
0 E9 _. [& m, [2 e. K+ V std::generate(vec1.begin(), vec1.end(), []() {0 t7 |: O. Z4 y$ O( m
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
& j9 T2 A& \) { });
- P9 p: F v# H7 N. }; M1 ^3 q* }4 l; X
std::generate(vec2.begin(), vec2.end(), []() {
. L) b# w. _2 O; H return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
9 Z! x- |" B9 G8 {: f# X% A& ?5 Y });
$ l" n* U" y7 u$ h, L7 j3 c4 B- n3 T0 N! C
for (size_t jj = 0; jj < vec1.size(); jj++); D0 E- M$ i0 C! Y; s) c
{0 i5 h' _" a7 A' ^$ \* V) _% t
b1[jj] = vec1[jj];. u; ]& e% c" h4 B& n; }
}" I# f, q6 `: n/ T. Y$ n
- R0 Z% k4 Z$ F# U for (size_t jj = 0; jj < vec2.size(); jj++)
/ r. C8 g& n% f {
: h, F, @' V, @1 d7 | b2[jj] = vec2[jj];
2 n: X5 W# q* ~+ ]3 L7 H }
1 \: c7 r ]: C1 A
/ L3 K7 f9 C& s' M( p% d //Method - 1 N=100000 247s 2 T: k6 B$ p5 H# z; \
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. _# C! {6 o- z& A$ W$ F4 ?+ V5 \, V & ~9 N3 B. g& X
//Method - 2 N=100000 237s/ D- j! T1 S* x2 n8 f
/*- ^! I8 u m" b0 i, A% ~# W6 q
for (int jj = 0; jj < N ; jj++)8 ?; m* e9 ?& S/ X1 ?
{& e7 M1 i, W! W/ a
fresult += vec1[jj] * vec2[jj];
; g* Z0 W' }2 Y } B, W. B- Q G/ n, S B2 Z
*/
6 u h2 k0 }% u3 ^' v ! Q# L( v4 @$ Z# \$ A+ O, O2 Y: D
//Method - 3 N=100000 204s" j( t% {8 D! Q" X: _8 Q& n
/*- ~' |/ r6 s0 \4 y+ C
for (int jj = 0; jj < N; jj++). u4 i* q+ }$ v! n
{
% W/ U. e2 Z1 u( { @1 e7 \, ?* c7 k fresult += b1[jj] * b2[jj];& r7 p" V0 p* t+ l0 Y
}' o8 Z3 n7 `, k" }7 f# {. w$ E
*/3 Z9 |. P( X% R
0 V6 R0 ~4 C( l" Y$ o1 y9 } //Method - 4 202s7 c: l% C" y. a, G) N- E/ g( g
/*
; f; z, q9 [( h' f% B6 i for (int jj = 0; jj < N; jj++)
1 c# r( `2 |4 C% Y( I* z2 m0 E* B0 T {1 A2 [. [- C3 |$ Z
8 l& n3 @$ D Z ~$ q& }
}" C( U; S: U2 F; D' n1 w b9 a
*/* L/ D' y! e- _3 A
//comment out all methods, N=100000 202s . H& {3 n4 ?) Y6 w& t, K; @# ^
}
( L" `* K4 S( P
; _ K+ g8 I n$ s* \' o delete []b1;! k1 w" b' [8 g+ `9 N) `
delete []b2;
+ R! k6 I4 k+ w# n6 R! ^3 o4 | |
|