TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
8 R$ ^* E1 h o& a, \ d
' m4 W$ c6 N; p) K |7 _理了理思路,重新做了一个测试。2 R* b9 I' J. m7 K, _
做了两个 vector 和 两个 float *, 都长 100000
( O: J. L3 Q( Q! W& a外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
5 h3 t3 g6 a! a& B$ _3 X9 B
w' H f+ I" q内循环试了4种方法,
( x+ [: M% _8 f& B- f/ h1. 直接调用 vector inner_product 247s / i" o5 L" _0 Z0 D. r0 C
2. vector 循环点乘累加 237s
# H9 F. X C1 }' ?& v; P3. float * 循环点乘累加 204s
2 \* @# f/ i7 ], F& z0 z0 v) l z- o2 w4. 空循环 100000 次 202s
4 n% H/ t0 R3 i) y
8 l$ P6 z6 _! y! j, s不做内循环 200s
1 D4 ~- Q* ]' ~# g8 D; n# l3 T! M+ J4 Q5 ?! g( M( |
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
- D8 t" ^2 K; o7 j# a另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
) \( N( y4 @) I* ]5 E$ K2 V& Z$ s+ P, X' H4 [1 _
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
4 B# m1 |. @- U# U# n8 s7 C6 a; b- v2 w, a% l+ z8 @
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL), \1 f2 |7 O. w( {; Z4 E
' g# N. K6 b; W# H, ]* a* e std::vector < float > vec1(N);& Q p* b- W% e2 c
std::vector < float > vec2(N);
4 Q* X( h* O/ _2 _2 ]2 U' x* K4 i# z float* b1 = new float[N];' Y8 x: [! G' g$ [* q
float* b2 = new float[N];
3 _' c6 J4 B4 k$ ~" l8 P6 h7 M1 d/ o5 f6 g- B0 ?' s
for (int j = 0; j < 6000; j++)
8 V) I, ?, u6 X. `$ \ {2 W" N# ?* n9 h0 D% P7 |
std::generate(vec1.begin(), vec1.end(), []() {
4 G9 [4 e/ a; U: m8 \ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 X1 u# n+ X/ W' K; O
});& p8 _- |3 |* r
4 r2 J/ r3 F/ w) v" T
std::generate(vec2.begin(), vec2.end(), []() {
$ m3 c; @; `! w; v* T0 \! j return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;0 S e. x6 M: {, K- e5 [
});
8 y T- U% y; Z! M6 [, P! a9 Z
( _$ I0 K# T5 u) D1 T2 Z' q for (size_t jj = 0; jj < vec1.size(); jj++)
+ d% o; T1 E/ V {* C% {7 V- I0 A; \9 g
b1[jj] = vec1[jj];: Q, Z1 t; @! J6 J$ g* U
}& A" z- [7 v% G& v: _
- H" `8 s$ s1 {; t2 _8 ? for (size_t jj = 0; jj < vec2.size(); jj++)
0 ^5 ?$ ?6 F T3 s M; b% i+ [ {
9 u) N, P* p3 @% W6 | b2[jj] = vec2[jj];
1 R5 X) b, B1 ^; n9 d4 R) k% {" ] }
) Q1 e. e* b8 } Z9 u: x4 |
# }+ t* {6 O/ v% F H$ P% P //Method - 1 N=100000 247s
9 @0 M- |; T; C( s, S //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
" p: N- Z% ~7 v0 X1 f
& ~- z" R( @; N0 F7 I1 U //Method - 2 N=100000 237s$ ]8 z) f) P( X1 D# ~
/*
" R( M* \% Y. Z/ Y# c6 C$ t. W) o, w for (int jj = 0; jj < N ; jj++)
, E( @0 ~7 H: n6 v/ X5 l( c {
\4 | @' f: E- B& _ fresult += vec1[jj] * vec2[jj];
) l( }' W/ V9 {: M }
5 S5 e& o3 ]! S" A0 N */
! Z+ c- c8 ~% i+ c0 W. l$ o L i' H$ o3 c
//Method - 3 N=100000 204s+ }% U: p9 f @8 }& A! O
/*) Q& q( {) V* C6 Q: j, B5 l
for (int jj = 0; jj < N; jj++)
+ {3 g3 `+ b" j* ^ j2 R) } {
& s! X' H, D/ \7 w fresult += b1[jj] * b2[jj];
6 F8 [7 j4 Y1 ~/ B! o1 G5 _; V. ] }
3 d+ t8 N3 o- P6 e' z* P4 z& S */$ F1 Y% w5 l* w- ]* p
3 @1 S6 j) e: q/ c0 b0 O //Method - 4 202s
0 ?1 k) Q2 |6 {8 z /*3 ~8 g- V0 M( l2 p
for (int jj = 0; jj < N; jj++)5 n% f# V8 i2 `8 U6 D0 ?& s
{
6 E8 K- f) J: K
# X7 i7 ]) H4 b& |" \: [: G }, g" [# y( d9 g
*/% i0 b1 K/ B; y" i
//comment out all methods, N=100000 202s ' y6 |; A0 S1 e& }) u4 p
}6 e0 [1 ~0 U8 u# l: r0 L/ n
& V; v! X8 M4 ?, r- Z/ E delete []b1;
' z2 {6 K0 Q! w0 P$ P delete []b2; ; y6 z/ O/ L: W: Y5 b8 E! Y
|
|