TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 # Y' U0 L9 S& h# m/ z+ }# j
7 }7 q& P4 i7 U& D; N4 Z3 s
理了理思路,重新做了一个测试。* m" k4 J) |8 h5 v4 ` \ ]/ O. |! D
做了两个 vector 和 两个 float *, 都长 100000
/ h6 n9 A$ C; I! v8 k8 i8 N外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." R$ b/ ~/ e+ g# o$ Z# P/ H' \
. E& h; d3 v; {& O$ N3 D内循环试了4种方法,
T* K7 y7 d2 Y* U5 |3 A! J1. 直接调用 vector inner_product 247s 1 N" V: P* X, s8 s# z, W' J. h
2. vector 循环点乘累加 237s$ K: `& G2 C' j' ~
3. float * 循环点乘累加 204s
' F, j1 E( m, c+ I5 T8 q4. 空循环 100000 次 202s
. r" w5 O: E6 E: A( e4 [& s7 J2 I& o- w' [
不做内循环 200s7 @4 c: b- c# N2 M' I ~1 n* i; d! M
9 c" J# g! t) t9 H' [+ D/ n. k你昨天说的对,内循环本身占比是很小的,大头在其他处理。
4 ?. x' g5 n2 l3 r另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
+ u4 y/ @( ?2 _8 h& U% `
2 J+ g5 B& G" s( p' P* H1 Q至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)3 D% C- ~" ]0 d' D$ M8 h
$ W" e4 p8 }8 Y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
1 N! w4 `& `2 e" v; K7 y- a3 W
& `4 I3 u. d: b std::vector < float > vec1(N);
% F9 w- A2 r( h8 @ std::vector < float > vec2(N);
! S4 N; U) b* @4 g$ i$ S float* b1 = new float[N];# k* m2 a, A' { | Y
float* b2 = new float[N];) d+ m$ ?" _. f! G+ H8 d
4 j! |4 D+ d& _! M; ]$ [/ m
for (int j = 0; j < 6000; j++)/ Q' ^/ Z; X, P' ?7 q+ @8 g B1 f: |
{
* n. K' \2 |0 W+ P8 ~8 Y) T1 m std::generate(vec1.begin(), vec1.end(), []() {
/ x8 V9 Q* Q/ _2 v3 V$ G, t3 _8 z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, |. V9 j6 K8 t+ W9 P
});2 d L9 Q& e/ b* l0 l
8 u* D1 O$ _$ K# Q1 b' I std::generate(vec2.begin(), vec2.end(), []() {
7 i. I8 U, |0 q) i; |. |; X return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;1 e# _) E6 M3 `! i* |
});
3 A# n4 `, |% N2 S% k$ E1 [! ^# v) U( k* w% k% S- R
for (size_t jj = 0; jj < vec1.size(); jj++)
5 P8 y) W) A1 A" ^2 `, M) k {2 I5 l8 h8 b; Q3 d: M' b
b1[jj] = vec1[jj];
/ g( S' f2 D; q$ m) }! @7 |- N' p }
( {0 n' ^/ s/ P; X4 J& u% t1 y3 o! w+ u8 X9 K$ e# l! y2 q# z
for (size_t jj = 0; jj < vec2.size(); jj++)' U+ X" f% U; d; r9 k; P
{+ y/ B m2 ?* g* k' v p
b2[jj] = vec2[jj];
5 ]. ^/ N9 B% V }/ P. g; P/ R& W2 S! I: N
! m" T8 B5 a* c: ?- D
//Method - 1 N=100000 247s
& t' D4 x) X7 X b( S p$ o' d //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);2 r" ^+ \1 Y) ` P- }1 D) i
0 f' ~% s ~# \$ O //Method - 2 N=100000 237s
3 n3 N+ T+ [( i9 ? /*; O, x" m0 L8 D: r P* F, m
for (int jj = 0; jj < N ; jj++)
5 Y3 U; z" I7 D9 J8 |3 w {2 y6 z. p1 @+ k8 S! [9 P; x" r9 a
fresult += vec1[jj] * vec2[jj];, b3 C) w* f; l5 p( W- m6 U
}
5 O: }" Y) ?5 m4 M */- x; d9 v, A1 [! K' r6 S. Z% ]! Z9 l8 v
* s5 k+ g1 z" g9 Q$ }, w
//Method - 3 N=100000 204s# ]! a) Q" Z$ m
/*4 D s% y `' X: [$ Z
for (int jj = 0; jj < N; jj++)
8 m" D; g$ G- ~. C/ i {% X" H0 |' c5 i- i3 C; T# q
fresult += b1[jj] * b2[jj];* a' Z/ k% T5 Y7 D+ W; c
}' P5 \" s% }4 e. w$ C, b
*/
( b. E& n5 ? `6 Q- m
1 x5 z4 Y& ~/ P" U2 A6 B t* @ //Method - 4 202s
+ Y6 z d t' \ /*. m5 O1 G! |$ P3 D# v
for (int jj = 0; jj < N; jj++)
3 W( Y: V) E1 M2 M3 U+ }8 } {2 I5 q5 ]) [+ K6 x" [
0 `$ N! n' G% g( O
}$ |7 N, m; m# T. y
*/% E* m( V5 S8 _" N
//comment out all methods, N=100000 202s ( X3 m4 R) K* k" O7 N2 g
}' @/ y. M9 x+ n
! L3 a- a j3 s
delete []b1;
8 Q+ y* K) W/ R+ c4 T delete []b2; 8 D/ W: d% X3 a. d g
|
|