TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 : R' G5 }' V6 Q
9 F6 S0 M' i! g' c0 D
理了理思路,重新做了一个测试。
* |# e" c2 c% g8 |" G; j0 W做了两个 vector 和 两个 float *, 都长 100000& `# Y7 r" x4 m0 r" A# R" g6 ?
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
* C/ o; J' K4 Q0 [
! _& F) R# p9 s内循环试了4种方法,0 F, t! [; F0 I% P+ H5 f4 c
1. 直接调用 vector inner_product 247s ; S! e( G; Q" |
2. vector 循环点乘累加 237s
, d4 M9 A4 f2 s$ q6 X6 Q# m3. float * 循环点乘累加 204s4 w( Q2 n7 L5 u7 s# h
4. 空循环 100000 次 202s
* j# f( G2 `+ l L( y- p3 Y6 C; _, i2 ~# m8 U4 l
不做内循环 200s
) e6 v+ J# P7 [; E& K7 c% M9 F. ~& y# l
你昨天说的对,内循环本身占比是很小的,大头在其他处理。# E8 z' ]2 Y' C$ j: v: W; I9 e
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 a# v) ^' u0 n" t# J
: e5 y$ O$ H( C8 r q# R* M
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
2 [) K: c2 w& ?1 u% E( i
: W4 }5 ^# _" G* |, \(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
`3 ]6 k9 H+ c2 o
3 _/ }0 z0 a! B2 X& I std::vector < float > vec1(N);1 l f, ~" K& i' O$ d+ I* M% X
std::vector < float > vec2(N);
3 X! g" F# x8 y2 c# w8 K. c float* b1 = new float[N];( i' c! K2 e4 z9 M; s
float* b2 = new float[N];
0 t1 j; N* i+ B2 O
" r' I7 O# o7 d for (int j = 0; j < 6000; j++)
" v, {3 s y' b3 e {
( h* y! [9 t- i; ?- e std::generate(vec1.begin(), vec1.end(), []() {
5 u$ a' X0 V/ e7 C8 t return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
" i$ A9 [$ ^; P/ P3 v }); L/ ?: v% Y) U9 ^8 }! i: ^
- {4 _7 M" W4 o8 G5 J! M* r4 o std::generate(vec2.begin(), vec2.end(), []() {0 G2 F% ]' X+ x- }9 I
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;1 C" z$ J Q" e& D K4 K: b
});+ k5 M2 s) m( d: ]2 |
3 m' r) X" I( ~0 _1 N7 ` for (size_t jj = 0; jj < vec1.size(); jj++)7 A- m1 Y G4 `$ v: c, P% m6 I* r
{0 a( f/ X7 A2 S3 l) g+ D
b1[jj] = vec1[jj];
9 k& h5 b4 l( x# @2 v- d, N) l }
. A* c6 h3 [; _& o: @
6 b2 y4 t# G" y6 A& { for (size_t jj = 0; jj < vec2.size(); jj++)2 m4 v9 p- l6 V
{
$ @: \; W7 ]+ R+ P b2[jj] = vec2[jj];; D- a" l' F* ~/ n1 m4 J- d
}
% A. s( y P9 ?7 j9 L( j9 u6 V, ?; F
//Method - 1 N=100000 247s
- k/ _6 I4 G9 A3 w' Q# y //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 z1 U+ f5 k4 B W; x
5 t7 Y8 q! F6 m/ I. E
//Method - 2 N=100000 237s
) ?1 I9 y+ P( B5 X3 C+ s /*; z8 S$ y6 `% U, m) }
for (int jj = 0; jj < N ; jj++)
" \1 ~9 q/ {# g8 Z$ G F' M {. T/ l4 D4 a- ~( Q1 B8 Y5 j
fresult += vec1[jj] * vec2[jj];
+ k/ a `0 e0 L5 s: } }8 w7 F" F! T4 M$ u! m1 X
*/% `4 o/ s! r9 |5 k+ f
# M0 h. }8 S/ e' b8 ~4 w" W
//Method - 3 N=100000 204s3 D, X5 j* C$ i3 V5 R, ~! G
/*
; y8 g7 M" e+ n: _7 s for (int jj = 0; jj < N; jj++); f- y4 a- s4 O% ]
{6 Z1 K; R' I* Y3 q9 R
fresult += b1[jj] * b2[jj];3 V' Y8 O3 Q( p! |2 x. w
}
3 m8 v9 e9 i) n' i' D, i; E */$ w! z1 K8 \7 [) W, I- _, R3 j
m( `( d$ u- D1 a: p //Method - 4 202s- q1 O, s# P$ d2 z$ M
/*( ~& C" G% G( x4 ~9 u* N% |
for (int jj = 0; jj < N; jj++)3 b" S: D; q& r2 W% I7 [! S
{
2 g% `2 o3 ?# I* w W% o
; j) G5 T& y7 d+ X3 i9 M8 X }
9 E# g& x7 K4 M */* T A7 Z! f0 ^2 t6 Q/ A
//comment out all methods, N=100000 202s
8 W( S/ [$ E; z% }8 n }4 Y* A5 ]7 X3 k, D2 E F
1 F) C: `: ^: |6 g
delete []b1;
9 z; O( j% R! ? delete []b2;
5 X, y2 {' L+ z' q9 _" G |
|