TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
5 b( b; g6 s+ ^: ? k
. O$ s% ]+ z- T7 ~0 j理了理思路,重新做了一个测试。4 W. \$ ?# @0 J2 ~
做了两个 vector 和 两个 float *, 都长 100000- K1 I! v) f M/ t4 Q
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
% m* q6 F; O4 J( ^2 H- m/ \
0 I6 s- m8 X% R7 O4 @* O0 Q内循环试了4种方法,9 l( W ]; d0 a: ?
1. 直接调用 vector inner_product 247s
3 X) f D7 `2 z% B3 G/ y9 v6 s2. vector 循环点乘累加 237s
- g5 o8 J1 ^0 C( D) Q& I, ]5 W3. float * 循环点乘累加 204s8 o8 G1 y. B6 D/ I
4. 空循环 100000 次 202s
0 e* P2 _" p) d" b! D4 f& Z2 ]
5 z( }$ j. w, o! E. k* w# z不做内循环 200s$ v9 Q. Y/ H1 x7 m0 `9 m$ c
) C! E. I; q; y4 z. r你昨天说的对,内循环本身占比是很小的,大头在其他处理。' Q. t% w4 J, W# w2 U5 ?% C
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
; e5 _# `- g; |6 _! X
7 b' T0 |. \$ d1 D }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)2 M2 H0 I% X7 l# ~4 H
( o% q! @# }' m# z* D$ p% b' K(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
4 `6 M5 \& ~9 u& _2 Y% D+ j% O; a F8 F4 u& L& m% D1 {' n% G
std::vector < float > vec1(N);
7 j+ ^7 B+ i& T, | std::vector < float > vec2(N);( V' }3 v, C: T
float* b1 = new float[N];+ b. a, d$ z3 E- M# d) a
float* b2 = new float[N];; U- M2 G. D1 }! l, H8 A( F
' E! T+ b! G+ s. L/ C' }1 g- F, V for (int j = 0; j < 6000; j++)! [( \. \( x$ G0 ~; u0 f* G2 D
{
& S* [# ?) s1 y* G0 K: h1 f) i std::generate(vec1.begin(), vec1.end(), []() {- e: a# r7 f% v/ o# f+ P# I* x
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, s1 [# q8 z4 }9 i; e, b
});
) n/ G/ q A6 I7 R- E" r. u
( D5 c, `( b, z std::generate(vec2.begin(), vec2.end(), []() {
: G$ G& u" n* x4 B; _3 b return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
4 w; N! S( D ~ });
3 `6 @7 r* b$ ~. ~; o& [8 e+ o# u1 r9 X$ W& W
for (size_t jj = 0; jj < vec1.size(); jj++)$ l6 m* z8 y: u2 B
{
! Q/ F$ b6 a3 m: x% U0 m0 I6 i b1[jj] = vec1[jj];5 X* s) _. J. r0 y
}2 v% U# W# h/ v6 A3 w% r, v
; b, M+ H# k: d! U' n9 L# W
for (size_t jj = 0; jj < vec2.size(); jj++)9 A* ]. o5 {- D* U. ^
{6 O4 s9 I4 Y6 i5 B
b2[jj] = vec2[jj];
9 A4 w! ?" v( E" F) ^3 y }
* S4 d# T: D6 @6 z' c. v0 t& e3 _& k# [! Q
//Method - 1 N=100000 247s
$ O& c' f. c; Z# [ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
7 g6 \* L- X6 h3 V( F8 F- _ ) r( j) `) Z! ^# B
//Method - 2 N=100000 237s2 L1 \. A7 ?. q* r/ G
/*
8 i: @! B% Q/ Q! A+ k for (int jj = 0; jj < N ; jj++)* |" ]1 d7 [6 T, o' C5 X
{
" v X3 g ]8 `& W fresult += vec1[jj] * vec2[jj];( y$ [8 k8 }3 |4 S
}
8 {- q2 N! c% I( N- c% S */
* v1 t2 a- G3 a( K* b; ` ; T& i( l) }* P! F' [& N
//Method - 3 N=100000 204s5 r- n0 P- D" Q+ l5 E! ?$ g
/*
% M3 I( L/ s# A for (int jj = 0; jj < N; jj++)- u. H8 T/ V2 y8 l# h2 C
{
; l [& [ _& i! B% X fresult += b1[jj] * b2[jj];
5 }; a, Y9 s5 h; q1 r8 {2 ~% p! _7 ? }
3 @5 X1 ?( j5 e) W */
9 K' d: U) ^& J8 w9 m0 v# r, @' W2 I# E) f ^# w
//Method - 4 202s
' P6 {0 c& o- a6 s9 D; J /*
9 E- Q* `: H- o& k7 K for (int jj = 0; jj < N; jj++)' c( q0 o1 z- o! @, \" n
{
( _4 P/ }( I8 H; x
$ O2 Z# u0 s/ ~2 H0 `2 M }4 G) G' j; X0 I) V( t( B
*/4 w c2 K j% Y9 {6 G
//comment out all methods, N=100000 202s
+ F+ ~+ n3 x9 S3 C/ U7 j }8 M! A: I, V6 K/ A
. Y" V& F6 O+ _' b- b
delete []b1;
3 T2 m8 \& ~8 Y _. T delete []b2; 8 I3 {3 C% T8 |8 d
|
|