TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 4 [0 V5 T1 X( D0 s" L) e( u
) A) }7 @' O& p1 V理了理思路,重新做了一个测试。; }4 ]1 Z% Z! _& X, ^6 _2 J# x( @
做了两个 vector 和 两个 float *, 都长 100000
( E3 {4 G C2 |8 P2 f4 ~ E外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 z" f3 }+ @$ P
6 f% ^' s4 J5 p( a" j& }4 i内循环试了4种方法,
: @* C3 u; R8 ~+ S v! C$ A# P1. 直接调用 vector inner_product 247s
$ g% c# n' ], a' @. y4 y% l2. vector 循环点乘累加 237s7 U- L$ @4 ?2 c" n# _
3. float * 循环点乘累加 204s
1 t. u" {8 w9 J' q4. 空循环 100000 次 202s
2 i, M% K3 A8 e) w" M( F8 R$ S1 ?' c. {' Q1 m
不做内循环 200s+ r8 e. Z: B( J. N, P3 p9 [
; g- m9 e) N+ Y C( U$ C& @+ @
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
' I) y! u5 o) _0 e- d2 y# {另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 @. k2 B9 e8 c$ W: G' z+ [2 P8 F
. G' }* H0 [( h' q N' W% U
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
. a8 M0 a. l* D) @% y: W1 k- v" v' F' F ]0 a
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
2 O4 P- t, o6 M5 r! X
( B6 t# a1 X8 z- `0 P std::vector < float > vec1(N);
8 Y2 L; ]! Z R: X. Z std::vector < float > vec2(N);1 V$ \' m m$ C: Y" h6 @
float* b1 = new float[N];
G k# q w' R7 \ float* b2 = new float[N];
4 g4 d9 c' [7 ?, [$ O8 l+ h' F% h/ D0 P# n; C
for (int j = 0; j < 6000; j++)/ h1 S% Q$ t* K7 _
{( o: t, @7 D6 T9 X
std::generate(vec1.begin(), vec1.end(), []() {
5 ], ~) n, A, l, k8 ^ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! V; u% h" \: u( z5 F; N# k" O: G
});
& z$ E( T6 C1 R# U6 Y& D k- F& R+ ]+ a
$ G ]/ ] ^0 l. e- {: q std::generate(vec2.begin(), vec2.end(), []() {- F5 q8 W) E2 v E% F/ G% z O* A0 o& b
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
2 T- D V- v9 x/ e });
& B" o8 F$ n+ a3 q' l. ^9 H( ^% Z
for (size_t jj = 0; jj < vec1.size(); jj++)! [( V# p x, w- y" g0 f, V; L# S
{
! [/ @) P1 T: a |7 h" w/ ^ b1[jj] = vec1[jj];
* ?. W. N( d5 _: w& b' E }
2 F9 {7 _+ Y4 g L
" X' [- A; \- h1 L) _ for (size_t jj = 0; jj < vec2.size(); jj++), J& h; O! H; O- p6 {4 k3 I
{
$ l' B) Z$ q- W' @! j7 Y. K b2[jj] = vec2[jj];' l" L4 j! ]! M8 _7 r, R
}
" F5 j) k" S+ F' K3 T' w! M- f
4 d9 T0 ^; R9 C, `( b //Method - 1 N=100000 247s 2 u& S; Z" L: f/ ]. p
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
* B8 u( Q8 L' D* S; e5 S# ` % g- A8 l9 m) a, Z
//Method - 2 N=100000 237s
) o1 s& _6 c( K# e s( i /*& d2 m9 B6 B3 T$ z, r' S
for (int jj = 0; jj < N ; jj++)
) M- ]( j' J6 J- M" _ D* V* ~4 n {9 m8 x4 v; @1 o( ~
fresult += vec1[jj] * vec2[jj];
) S! V" G; B4 g: J, m0 R4 b: D; C }+ i$ ], ^: `: q3 C4 w) u( |, w
*/
) ]0 y; S; `( Z7 n% C9 {
9 Z; P% z& ]6 r3 A* q# T/ Q1 j //Method - 3 N=100000 204s
$ J3 `2 b) V% A/ C /*
$ y6 B8 O. T1 O6 N for (int jj = 0; jj < N; jj++)
" m o7 T2 p5 y2 `- Q {
- |' H: f. c, b/ n& g% v fresult += b1[jj] * b2[jj];/ B# W2 u7 N5 V! R. N" d' X2 C
}
* N) A+ g- ~! h: G' c- g. m7 S2 f7 r */4 a* K2 i7 z( B' ?
6 I3 [8 }4 Y% Y. o: f //Method - 4 202s3 G4 `1 o: H/ }. f( [' D& B6 o/ E
/*$ {$ B/ W4 j6 H/ k: V; K
for (int jj = 0; jj < N; jj++)* n) m/ H1 N5 `2 @! h
{ V3 q! d2 p# c7 w6 j
7 `5 Q9 U6 X1 D
}
+ c) t/ D% v5 W4 x */" r& L# y* V+ l* K# e
//comment out all methods, N=100000 202s % h: Y# }2 C5 b5 s
}
0 J7 c& {$ P( f$ w5 I% f+ Q2 ^6 P4 \* I9 B, p
delete []b1;3 j- h% I# t! J+ t: n
delete []b2; x9 |$ d: N, W
|
|