TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
1 A- D! R5 J5 q: D; e+ a U6 b1 @! m' f
理了理思路,重新做了一个测试。
; C/ V* T' X M: o5 j4 \做了两个 vector 和 两个 float *, 都长 100000
' r4 C% E7 {4 G/ t. b外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' E1 A1 c) @- m# Q' D5 h" i
, F, F: z m4 F, U2 u b内循环试了4种方法,5 S; }1 d# [& z# |
1. 直接调用 vector inner_product 247s * C" \8 z5 _/ i! _( I9 q
2. vector 循环点乘累加 237s `/ y( E1 i% h8 s
3. float * 循环点乘累加 204s% c, p# C `; U9 N
4. 空循环 100000 次 202s) @! K- D l: P+ E
! o# a( }% w {6 | j# P+ R; ?: l不做内循环 200s, j* I- Q& o/ g$ ?5 y
: Z3 b9 }3 R7 y& p$ e) O4 r
你昨天说的对,内循环本身占比是很小的,大头在其他处理。9 b+ @3 a" { { l z6 `
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。% v D: N2 J2 F N6 [8 K. L( S3 c
$ Y' e- M X* M; [: A8 I2 I至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
8 d1 v5 I9 a3 Q3 h( ~6 A+ p6 {; }1 `$ p% J4 I. ]
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)- v4 d% A# ]. `' U" r& c' X
: O* n/ H& E. C! d1 B. s0 [1 C& u
std::vector < float > vec1(N);% d. }2 q# U3 ` B
std::vector < float > vec2(N);
/ m( W- v3 z6 {5 B8 N2 X float* b1 = new float[N];
; @: ]' m$ T, Y2 @7 D float* b2 = new float[N];
3 A7 k. p, I& L2 y3 B0 v
/ q( W7 D( D7 X" f& H for (int j = 0; j < 6000; j++)- u+ u! ^8 w1 b7 b
{
, S4 o) K4 ^# V8 Q9 X std::generate(vec1.begin(), vec1.end(), []() {
+ c$ m: R( r# h" V# Q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
& N* }; R- @& x* M });! g; D* t9 l7 ?. j9 o3 }) m
+ @1 V& w E& a" V) u9 l: \9 s std::generate(vec2.begin(), vec2.end(), []() {# {" k8 X/ f( a) R0 G7 L Q) ^6 w
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
- R& G$ d2 N& A: _) N( K/ S });5 i; d2 F S& L/ d: N/ W
) p: D) h# j8 m; v
for (size_t jj = 0; jj < vec1.size(); jj++)
# l7 K5 d- M) K1 L3 ~ {; F/ X/ V* M/ s2 [6 R
b1[jj] = vec1[jj];
9 ]) W# }! r9 ]5 d }. y; E* z& P7 y8 K( a
. |. I( f$ H# V3 l c; q
for (size_t jj = 0; jj < vec2.size(); jj++)' S4 G& T }: v0 R2 t
{
0 o4 K+ I6 N, W9 }7 s N4 Z b2[jj] = vec2[jj];
0 ~& t8 l7 Z4 |- {2 A6 m2 Y }' ~: t) a( q. j2 M, J
7 V; H6 M: A" K& v- r- ~& v- I
//Method - 1 N=100000 247s ) N3 I5 Q% ?4 R+ ?& x
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);! g" O+ W% y; [* u
; O7 |( K3 A/ a/ ]3 j! @9 d //Method - 2 N=100000 237s+ F3 t! @+ ?/ _
/*& N, d7 Z* O" h S4 b! ?
for (int jj = 0; jj < N ; jj++)$ T8 \! h; l" I4 _4 h
{
1 ~8 l _, ?8 U' A6 G fresult += vec1[jj] * vec2[jj];6 S& u% H( |) Q9 }6 ^0 S
}
) m {7 B( g7 R8 F */
$ j8 a- B3 C {9 X+ ^ : A8 q3 ^- d4 o6 ~
//Method - 3 N=100000 204s2 h8 w. y' h+ ^. H
/*
( U7 n. [8 m6 @ for (int jj = 0; jj < N; jj++)
# m: L+ S! A9 g7 ^5 {) w {
' `2 X2 k5 Y8 J" m fresult += b1[jj] * b2[jj];$ g& _" `- E5 R y$ r# G
}7 g' _: R2 f& X4 s
*/4 p3 x3 Y, v* I/ w- F
) i2 F! |7 d) i0 p) D
//Method - 4 202s
. \4 Z5 @# z) w- J3 A9 ? /*8 A" d$ T/ h& y( ]( L
for (int jj = 0; jj < N; jj++)/ V: d( d- j$ k6 j( i
{; [) @, `8 q8 \' i# z5 z; T
7 H- Z% J2 \" t& H3 H4 s) b
}
/ d7 c# T& T' m1 ]% | */3 {/ j; O \/ Q6 h7 T
//comment out all methods, N=100000 202s $ m3 {! V: e+ W6 M9 U
}
) u$ ~) E! V- Q8 [0 l$ H; j; x$ x) v0 U7 {
delete []b1;
5 W/ y* p! W, O) l2 R w+ a delete []b2; ( U- S4 Z: l6 |6 B1 d
|
|