TA的每日心情 | 奋斗 4 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 $ g- t4 z" H+ e) K% [3 c9 s/ y8 L
+ v' O1 W) m$ ?# }
理了理思路,重新做了一个测试。4 C Z1 H! L& u R* {7 r
做了两个 vector 和 两个 float *, 都长 100000- ?* H# g: S) b$ e, e5 _) \+ l, W
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
% u1 T# q2 ^3 i
0 V }4 Z/ a; f8 q' x内循环试了4种方法,1 o+ z3 g" h8 I e/ i
1. 直接调用 vector inner_product 247s
. q) |% G5 ]* o9 H7 [0 c, o2. vector 循环点乘累加 237s9 E* P5 M& f) b, a$ M+ K! z
3. float * 循环点乘累加 204s9 q7 G" v6 f1 ~. g2 [) w& |4 F
4. 空循环 100000 次 202s+ |6 ?; \/ K* l0 y' g& B+ ~6 ^; `9 N
7 a" _1 y; q5 G! r, c不做内循环 200s ^; o* j! c% R" @' {
) ?% v; M2 ?: M6 h你昨天说的对,内循环本身占比是很小的,大头在其他处理。
# m& o& Z4 _2 I( N4 ]& j# R另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
C# W( s/ g" r7 O" g
# O# p6 t) w( Z6 r. l至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( x9 B4 c+ k4 E8 x" t8 A) X5 }1 @$ s) U% ^3 U2 I( N
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
, M8 b6 j. ~6 L* [, C/ P
% ]+ m: J, |$ Z& s std::vector < float > vec1(N);, x% I5 C# \3 H
std::vector < float > vec2(N);
; U( ?, k: h" o3 x! l& |# e float* b1 = new float[N];" O. ^) `- A ^6 o9 j0 T9 G3 A% \
float* b2 = new float[N];
8 C; t3 M$ i( h0 c# C G) v& w6 O/ f) |" v- N' E: ]
for (int j = 0; j < 6000; j++)
, u. m1 A5 Z# b8 g% m k' | {
& R( w: i0 U! O! C" J" E9 Y std::generate(vec1.begin(), vec1.end(), []() {/ C: Z. W9 D4 W1 t$ l
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
4 t( }$ w5 E) q/ w });
& I1 J* q" Z4 g: v# z& f
, L0 t* {$ H- |( C7 d std::generate(vec2.begin(), vec2.end(), []() {
7 `) a1 c- v8 |. s* U return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;. x0 E- R/ X; A7 m9 H$ \7 N7 W
});
! g" i9 T( o, a: w1 m$ s# ~" }2 p& |0 W* z2 m
for (size_t jj = 0; jj < vec1.size(); jj++)8 L, Z, i: P4 N7 V
{- s& I3 \! b: ?& p: V" I4 Z, c, s
b1[jj] = vec1[jj];
$ x, L; D9 [ j6 K, p }
4 N, h# T: c1 R; e4 l. M V$ J Q9 V9 z4 e+ X/ Y
for (size_t jj = 0; jj < vec2.size(); jj++)6 N; j* k3 u' b" `' }. ~* V! g
{; }' _3 V( a- T& k% ]. t5 w. {' F+ A
b2[jj] = vec2[jj];- }) T) |# H2 }1 v
}8 H1 E9 h+ c; a7 z
: A, _4 R; Z6 @! a0 Y: ]. L- z
//Method - 1 N=100000 247s
! K. R, F- t# O* m; H2 i4 ]( f) Z+ c //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0); S. f4 j2 p" }6 U, T/ ?+ L
) k9 [0 a0 h! q# I- g3 ] //Method - 2 N=100000 237s# J# ~# ?% G2 {$ N5 [
/*1 F2 X: W& ^) H& t% k' I) q
for (int jj = 0; jj < N ; jj++)/ {& G }. P1 z) n' [
{
, x) W, B$ I( z* a( I9 h! i fresult += vec1[jj] * vec2[jj];
1 d$ U; G3 v' t' B3 t }+ `/ J1 e9 \& Y" I4 J$ I/ h$ ]
*/
+ A1 B8 y( u# V. e6 h
) f# U( c- ?0 F( d //Method - 3 N=100000 204s7 i4 Z7 y" L7 V- G$ X
/*4 Q2 X* E6 s8 z- [4 W+ ^! Y; D
for (int jj = 0; jj < N; jj++)9 V! ~; S8 C; J4 g9 W
{! ~% h0 k$ h- W9 d4 _: y7 l5 T
fresult += b1[jj] * b2[jj];# `4 j% s, F3 w' Y
}" @7 l+ a. X# f1 Y3 w1 ^3 O! o6 p9 X
*/, H! ?6 a, M# R0 F; j9 L
1 @; g) J) `6 X7 H! ^3 f. s
//Method - 4 202s
5 C6 ]# _: r G; m; e /*
" w J8 s' ^8 }3 ?, b for (int jj = 0; jj < N; jj++), Z6 r2 U. P" E" \4 K
{ j# F! Q( B* W6 @) }) V5 F* j
% W- U% d: v4 `& O5 j
}
+ K. O7 }+ T" N6 e! H */3 g" Z5 n: t4 S6 _
//comment out all methods, N=100000 202s 7 ^% {0 G" U5 t# K% e
}9 u# t. l4 t1 O
5 i' B; ~( H Q/ z/ W$ | delete []b1;- h1 Z9 i9 }+ ^ V1 l" p& s1 a
delete []b2; % ^% G% n5 [0 _: ]
|
|