TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
0 G+ E3 }- w* T. s# `
3 B8 F0 g/ ~9 H# c3 w) R理了理思路,重新做了一个测试。
/ r; Z+ L7 x/ {4 W做了两个 vector 和 两个 float *, 都长 100000
~, v5 s6 n% ~! p+ F外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
5 I0 r( V7 O! ~0 T" `2 U3 x' H3 d
) `! T" I% L& n0 H1 G内循环试了4种方法,
" U& }+ t( p! X3 o9 F1. 直接调用 vector inner_product 247s : Y: C8 p& v0 u) n
2. vector 循环点乘累加 237s+ q" z y( V( D* Q
3. float * 循环点乘累加 204s+ Q! J" L- f1 p9 u$ V0 T
4. 空循环 100000 次 202s
( _0 @2 j* m" J
' J- A. j% I. l0 i+ L" P# X不做内循环 200s
/ p; [ r$ I2 {4 d
- M- u* p- x* w S( w你昨天说的对,内循环本身占比是很小的,大头在其他处理。+ {' |5 C- ^9 T( H/ p7 ^+ t
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) a: I. C: k* b3 I
0 v% o; O9 y; }, ?. B y* e2 a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
. y4 B5 z* Y, F5 n. D' [: Q' F2 P' p7 I6 m5 ^: N5 ]. T5 d O
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
0 g8 Q2 U! j& X! l
$ _( m r5 F" H& M std::vector < float > vec1(N);
6 @' n( a; s5 z/ v9 ]/ H std::vector < float > vec2(N);
9 z9 |* H5 W+ H float* b1 = new float[N];
; L0 H# D+ m/ F0 I: r7 z float* b2 = new float[N];
* o3 j2 \0 W4 |" U F& N8 l7 B+ Q; ?" W$ ?! a& E& S' i
for (int j = 0; j < 6000; j++)
* R/ e, c: E) L5 | {
: ~6 k7 u8 p1 @, I+ O, |/ d std::generate(vec1.begin(), vec1.end(), []() {8 M9 f# n6 K9 o+ C0 s# v9 n4 h2 b
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
6 g) [& s+ s' Q });
3 T$ i+ Q# B7 Q2 l3 s2 _
" x( _0 x, ?% n1 [9 \' A std::generate(vec2.begin(), vec2.end(), []() {0 S. {9 c s7 y7 E
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
/ ]# P, F- e2 [, C& A1 f });# G3 O a* H! C3 x. F# L
h3 Z0 z3 I8 N% r. [
for (size_t jj = 0; jj < vec1.size(); jj++)
) H; p5 O! g6 R- o0 P: r { Y/ x& C$ ^2 @8 T
b1[jj] = vec1[jj];
8 r. c3 G4 k# Z, v4 {6 U1 P% _" F6 o3 } }3 D+ o6 b! _( K- _' w
0 _- ^! o+ {. p# `! N
for (size_t jj = 0; jj < vec2.size(); jj++)% d3 b* \' ~/ E1 ~ R5 i9 c
{
" S, H) \/ J3 D5 r3 ] b2[jj] = vec2[jj];5 s& g: I( v! g* d
}" l7 [3 p, Z/ r/ @
" x1 H4 c' {: D" e( b5 T$ S8 A1 v* u
//Method - 1 N=100000 247s $ o/ N7 a( ?4 B7 ]0 Q9 C- }
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ z7 K7 A+ J! v. F, O
+ o( Z1 p2 W: V8 ] //Method - 2 N=100000 237s$ Y6 k. Q9 D; {
/*- _: g: r n! j: c. z' f" M
for (int jj = 0; jj < N ; jj++)+ [0 K& c8 [) ?' r
{
3 S7 `# N8 Z% x- I# _* m fresult += vec1[jj] * vec2[jj];
) r+ C7 |- w) u/ B/ ~ }
) P ~: j6 f; l1 [8 v- ~$ C$ u */
- i: c" l+ l' ^" V7 D' | * ^* z1 c( g% Z# y9 j+ j( C0 @- i
//Method - 3 N=100000 204s0 p$ W1 p, \' K# m2 t: V
/*6 D% o, [) H" r3 y# V3 q
for (int jj = 0; jj < N; jj++)& J6 k" O+ z" v) H( S
{
4 O1 U4 \8 ~) I; Q; K, } fresult += b1[jj] * b2[jj];( i B+ `6 x& p2 ]8 H% _7 V
}
" ~; R( I6 g/ g# t6 |, ?7 r$ p6 U */
, b( V6 w$ S2 m) m( I
% d/ J3 y3 W0 z3 q0 r2 y+ S7 ^# W //Method - 4 202s
+ b2 ^# C5 @" J. t, ~ /*8 y! r1 `3 {% Z! |! P8 d
for (int jj = 0; jj < N; jj++)/ o& F3 Q' P, b9 H- j# ~6 P1 T
{8 x! m ~4 {/ ?6 b
% z0 I: l8 ?- s! M0 l+ J }( B/ V- H, |! `( K) ]9 l
*/
( o" y# T; `) a7 A6 r //comment out all methods, N=100000 202s
( G# C7 X9 `+ `- { o7 x' Z }
4 K6 E+ M; \8 r% t) Y7 C
9 r/ F2 S6 w$ F5 { delete []b1;
- b& X* Y7 }5 p+ n) c delete []b2; 4 C& I& r' d2 }2 s, \
|
|