TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 $ M( a/ j) T6 [
- h" _& H* }) y理了理思路,重新做了一个测试。
+ o5 x1 n" L* d5 e- F做了两个 vector 和 两个 float *, 都长 100000, @+ Q9 b- t, h7 u2 B
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.- A q7 S0 V1 m; \) e
# }' i3 r* X1 ~! e# A' G6 `0 l
内循环试了4种方法,
4 j7 g2 Y! J( y2 ~* n7 c* W% @1. 直接调用 vector inner_product 247s
4 D1 `- }6 A j1 d. W$ B, C1 B2. vector 循环点乘累加 237s% q D7 ~* L' m8 q
3. float * 循环点乘累加 204s
% F6 t, p4 z' P" U ?' A4. 空循环 100000 次 202s
1 J8 | o: @" u+ R7 c1 E2 I; U. p# W& w' I. X. [& ~ w
不做内循环 200s
5 {$ W5 h5 K$ E! _: u' G, C# Y/ T4 o) X& }
你昨天说的对,内循环本身占比是很小的,大头在其他处理。) `3 N; c3 G! U% K5 W$ A9 T
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
6 g% j9 }/ J" Z5 e' s1 O* D0 h6 W& g
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)- N, Y1 A" D+ h3 N
7 Z; n; G$ x0 d: U
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
+ x" _3 ]/ g9 g+ p0 m A9 q+ I+ X0 W$ ~
std::vector < float > vec1(N);
, B6 S" I0 K! @$ @& F8 S- G std::vector < float > vec2(N);
2 h+ [6 h( r* k float* b1 = new float[N];
" q6 c. U& s! j2 J) v% w3 b float* b2 = new float[N];! O- L2 N+ E/ ^( v& g( W
( g! x, _1 y" ^* N" h- V
for (int j = 0; j < 6000; j++)1 @- K4 `3 w! T9 ?
{) o! X5 C6 c+ v; u" N- B+ L# H
std::generate(vec1.begin(), vec1.end(), []() {
0 @; g$ s6 G% k/ H6 f" M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;' u: y. i# L/ [4 N
});: W& f; q& A F" ~- }' n
. H& A- w8 ]' G7 q g
std::generate(vec2.begin(), vec2.end(), []() {2 f3 [9 P6 a" x
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
: `# ~( l U1 V( K- _, v });8 [% O5 ^0 ^( u, `! s( i9 t+ o
+ b7 L2 [$ R2 B9 `( ?
for (size_t jj = 0; jj < vec1.size(); jj++)
8 K; B. g& Q% z) f9 @6 [( Y& Q {$ |0 g* V. p- C5 V5 Y6 {; y' c V
b1[jj] = vec1[jj];0 c4 E; ~$ j/ V3 }# R, C& Z
}+ I _ F1 t1 \3 q
, I+ i! L+ N4 D
for (size_t jj = 0; jj < vec2.size(); jj++), y/ l4 F e; U. q2 C5 x# [3 k
{
' ?: V' Y |2 i b2[jj] = vec2[jj];
6 r8 m* c) r2 T; M' Y+ v5 B }* l8 }" ~3 G K- j2 A7 Y) T
0 j" R9 R& i# j
//Method - 1 N=100000 247s
. k# @9 R4 l/ I' w6 {' q$ T //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);/ o6 i2 F( d- w' K& g; }
4 h( f5 Q+ @6 U- o/ b
//Method - 2 N=100000 237s0 m8 b& K( P$ a7 J9 G. ]
/*
4 \; F: ~! [- X# w+ g for (int jj = 0; jj < N ; jj++)* N8 @( I- Z0 B
{- i. B: W. M E n N$ X
fresult += vec1[jj] * vec2[jj];
4 o& _; g) f$ P( K& N: f }. _5 v6 |1 I+ [/ I: V$ M- k, F5 T
*/
5 D( v: [+ @ x8 f" C- Y: d
; k8 p+ X) F% D2 Z' w% A& L //Method - 3 N=100000 204s' G1 e6 U9 O7 H. J$ T) R. i& k
/*
1 o& G8 X! K; e, W. d9 L7 S; Y& i for (int jj = 0; jj < N; jj++). n8 ~" O6 D; S; e" {9 Q8 V& A' g
{! D% E7 F) k _7 S* a
fresult += b1[jj] * b2[jj];8 y$ I& q: }+ O6 Q
} f2 e& P* M/ a6 {
*// w' f# r$ [& p, X
4 G0 Y4 o' P0 @ }
//Method - 4 202s. c6 t& k, l0 G9 E
/*' v' O* S' o$ R/ y' `8 \
for (int jj = 0; jj < N; jj++)
* C' B, \+ c$ L5 P& n {
p A7 l/ e. R9 d# ^1 F; f: i
# A3 s D; H# V- b8 V }
+ z" e R: }' h( V; ~$ l */
+ B- [# N, U0 ?7 J' N. p //comment out all methods, N=100000 202s ; B6 }9 ?( U- h2 }7 L. h
}2 d1 e i6 R# l- ^' G! K
, u( F o# u- p0 b2 _4 W delete []b1;$ ?, V* U" w) U: ~& g5 C L9 \
delete []b2; 4 N( @$ Q8 F, V: A* J0 T
|
|