TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
) o% `2 u* q, k0 q3 h
9 ?" F+ k' I5 c, b理了理思路,重新做了一个测试。9 s2 | U7 P) ~3 N$ t
做了两个 vector 和 两个 float *, 都长 100000 j$ d% s# `4 v' k3 {8 R
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
6 S/ L7 b4 b3 ?; ^+ ^; e, n" E8 G* M4 H/ R
内循环试了4种方法,0 b3 ~3 C1 D7 Y/ F# Y
1. 直接调用 vector inner_product 247s
2 r8 X& U) F7 ]# P7 ?! N, Y2. vector 循环点乘累加 237s& m% F; ~) h ]. x z
3. float * 循环点乘累加 204s
8 w; H# T6 `6 K' l4. 空循环 100000 次 202s
- x& g9 _8 p$ U+ @+ i9 a0 b( b
+ A4 d/ q: f4 |- x2 ^& l& W. b% h不做内循环 200s6 e8 z0 J1 i; d/ U" T! R* ?1 J
5 C2 w/ H1 H7 `1 j
你昨天说的对,内循环本身占比是很小的,大头在其他处理。; p3 {/ F, r1 ~, d" a1 }1 s. n- K
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 t" ~8 G7 J1 T" U4 g
1 h. Z8 B/ P. q" n3 P
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
/ y+ v5 Q; ^/ _# \- i3 Y7 H
$ A, f4 u6 W/ j# b3 h(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 N8 Z. A+ c+ a7 W
, k9 e6 z8 a1 M std::vector < float > vec1(N);, r2 [/ L2 X. [9 M! n/ g
std::vector < float > vec2(N);* `- N F% z8 M1 a5 W
float* b1 = new float[N];
3 }5 g0 w. m+ w$ | float* b2 = new float[N]; M6 u9 l6 d8 D$ P6 ]2 ~; C6 G; B
' ?0 Y$ e3 Y/ K for (int j = 0; j < 6000; j++)
) U& i' M4 e0 G6 d {7 v- I, e; d8 b! L
std::generate(vec1.begin(), vec1.end(), []() {& S/ `) @- B4 k
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
) X% u% i( g' ]8 u5 H: t });! M+ s; ~2 u# M0 h8 \' Y
5 `( q; V; N8 l1 N1 z
std::generate(vec2.begin(), vec2.end(), []() {
- A( v$ N8 J" {- v7 e4 E# R5 J# m/ p return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
$ S- d, s/ ^9 t* M6 D! w });! m" k8 b6 l+ n7 h5 g4 l- l; O- D+ b7 _2 O
+ T! N$ g, A0 E$ T3 J$ V! g* l for (size_t jj = 0; jj < vec1.size(); jj++)
; K4 r4 y2 f9 j- J- s {! |) q p1 h: l" A
b1[jj] = vec1[jj];
( M; U: g+ m4 C( R }
& @5 D e X2 A- @7 u) d9 N
' j0 J% @& f* E for (size_t jj = 0; jj < vec2.size(); jj++)
: |. u% m( R, y2 N! b+ q5 d6 m {6 L! G# e! a2 X( M0 O
b2[jj] = vec2[jj];# H: s# E; |$ X3 I; y: e* I8 {
}
1 d* w6 a K2 ~2 u E) W/ I5 A9 L" A0 h
//Method - 1 N=100000 247s
" A' f4 c* }, K% g! I \# \ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
' y& [! z2 e: M3 i% }8 V
+ Y+ u7 h$ c' K j //Method - 2 N=100000 237s5 s4 l) d# c# K, z0 N
/*3 L! B3 k: a' M! W7 l
for (int jj = 0; jj < N ; jj++)$ X- `3 }, p3 m3 H( H
{1 t1 L7 K7 c. f! W7 ^" D
fresult += vec1[jj] * vec2[jj];. O4 j& p! j& y/ Y5 n8 `
}5 s2 x$ z. X5 x
*/
# i$ P/ L' D0 U+ a) U! W- ^& } 0 ?8 x8 g3 L/ } |- C: @
//Method - 3 N=100000 204s
- G+ W& ?, d; ~- W /*
3 ~9 _8 e7 D. S; P1 o+ c! I9 ? for (int jj = 0; jj < N; jj++)
7 K) X9 \( X; ~ {! p& x1 `5 B( ?; e! A
fresult += b1[jj] * b2[jj];3 i6 _ a$ l* K# ]& T3 j- U
}
7 L1 z" E& s7 S6 H3 j6 s2 c */1 t. U9 W) i/ B* g6 x3 P4 Q. O
2 `; Z! h/ n$ _! A2 {* v
//Method - 4 202s% ~2 W6 {2 x/ C$ F
/*
# r1 S# y c/ r% M for (int jj = 0; jj < N; jj++)* |: {/ i& p- w$ N, A5 X4 {7 \9 T, s
{) V& A/ O) P5 b6 U1 F
/ O+ J- f- n/ i2 C9 H0 Z4 r }
# g# R5 C' i$ e3 Y/ j */
7 z9 c/ G$ i: B+ U- D //comment out all methods, N=100000 202s . D" `- X7 j+ [, U9 |# \4 k2 P0 s6 d
}) ^* [1 U' X5 q0 y0 F, Y" A: c5 o# z
& R, B% x7 @8 e6 `7 B3 j+ c
delete []b1;0 s/ m4 |! q7 d' T( o7 B
delete []b2; 7 z( V9 s! @. C& m- [ C# y& s
|
|