TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* \. N" S, ~, V' N4 L0 G! S2 D2 X* k1 Z, P
理了理思路,重新做了一个测试。" ^ {6 U H" I6 K: X- x
做了两个 vector 和 两个 float *, 都长 100000! }# I2 [' ?) g4 |! ^4 f
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 p# U4 D5 v6 B+ X4 W' e
, M4 v U J2 G0 L) G8 S内循环试了4种方法,
, w3 m+ E- K& e6 n1. 直接调用 vector inner_product 247s - \! L$ Y/ r* I6 x* x: ]
2. vector 循环点乘累加 237s7 n, \7 }+ T1 x6 q; |4 T
3. float * 循环点乘累加 204s9 v' k- |5 ~1 [6 S) A+ {9 O, f
4. 空循环 100000 次 202s8 h% x6 L6 R! a) j
* n9 X6 k1 x0 K3 f4 ]
不做内循环 200s
3 N Z: a) V6 \7 {
' p' f! a3 ~& n& _4 M# ]你昨天说的对,内循环本身占比是很小的,大头在其他处理。
! `; q& l) [2 Y: D" `另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
* s! d& {! G" Q9 E- P
" G. ?% c+ h# N* l. S至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)# w( I$ U- ~. Q
, ]. R) i; t: T2 h7 D: y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL): S/ \. [6 O9 J
, d/ T9 V! P- R: K+ ]
std::vector < float > vec1(N);
0 O% R6 z3 s6 L( I' ]& Z std::vector < float > vec2(N);" J7 m" C. M% t! S: u& K2 g
float* b1 = new float[N];- N3 D3 S6 H9 D9 z1 a# M
float* b2 = new float[N];" y; x& w7 ~* Z, j
* R& T5 H" f. \9 [* z
for (int j = 0; j < 6000; j++)
' U; w5 Y3 e( b' {! s {
/ O7 @! e8 X- q5 M% U; _ std::generate(vec1.begin(), vec1.end(), []() {' Q" B3 I! D9 r- A3 v5 u: I$ b
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, F6 i1 T! z. E0 Q/ p. B
});
( D& F. r7 O' J$ M# p0 Q# @
6 [! ~+ c! S+ Y7 u std::generate(vec2.begin(), vec2.end(), []() {. ^0 W9 w" A* u( o
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 P+ \2 S7 Y: q0 W! y7 F& z
});& }0 ?4 d; h# m
) ~7 q8 E$ l& b) i- [0 d
for (size_t jj = 0; jj < vec1.size(); jj++)
5 q9 m2 W" v5 A. [2 Q, V- G6 ] {/ {0 W3 ]' X5 q5 C" L
b1[jj] = vec1[jj];
8 s& x- Y a/ N$ H }5 y" d0 ?, S3 P1 k. ]! r4 n% R
3 `5 ~" I& ~8 q3 K/ U for (size_t jj = 0; jj < vec2.size(); jj++)
% ~. p7 p) N: b3 p8 S( m {
& W/ p: Y- z$ l- W/ Q* f& w b2[jj] = vec2[jj];
8 W2 r5 I5 t. m* o/ S3 k. W( E* } }
R! }/ [7 M* g: @5 @, H% y/ K% i( N! T% h! e& o y
//Method - 1 N=100000 247s & D) E. @0 u" g+ F: o8 A' r
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
" H) \1 C0 g& C- R% P $ a: N7 z, F5 G) a w; L" u0 ]
//Method - 2 N=100000 237s
9 L% }: ?9 t" S% H" }9 K6 b /*. Q Y; u8 b* U3 B3 b0 V( W
for (int jj = 0; jj < N ; jj++)6 h9 X% I/ F! u! C4 U
{2 D) V2 f; L7 {0 D' H. ]# @- b
fresult += vec1[jj] * vec2[jj];
3 c6 D: c) {1 ~* W }
) F# X* i/ n( ` */
' O0 Z' S6 i3 E$ Z" k/ l 6 E2 Q0 }" s8 R B
//Method - 3 N=100000 204s
! ^5 o4 O; G3 |2 j9 q /*, g( E8 \/ F; l$ i! N% {; x
for (int jj = 0; jj < N; jj++)9 {# U* Q4 s7 i' }
{1 m w, ]# ?0 G% f9 r/ O
fresult += b1[jj] * b2[jj];9 Q6 H: _1 s6 R8 `
}$ [1 @( i* a4 s$ L- s- s: q
*/5 Z& V4 f' s$ j" l: Z% x
& Z2 ]7 ^! X- G //Method - 4 202s
; U5 e* ^/ [% J /*9 B7 N9 P* a* M1 O0 x& Y* \
for (int jj = 0; jj < N; jj++)
. U M0 k* @& [! \. I9 K" f3 | {
* {& z) ?( [$ g* \8 i / P- }1 ]$ b) i' R
}% \9 f# |/ B% a" ]0 u: B
*/- [8 X/ P5 T' R V; v7 J
//comment out all methods, N=100000 202s ; U* c: }) j! B7 l9 y
}6 _7 H* b" y: v# A
, _8 t) D6 C) L M6 V7 z# [4 B+ g
delete []b1;& }) Y: q/ a/ e# y7 R
delete []b2; 3 |/ C; n* w2 p# Y
|
|