TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 s$ u) ~, Y" a# z/ l6 x+ T# P
( W# U3 d8 r& l- [9 r# X1 b& b: p理了理思路,重新做了一个测试。4 A# Z% l3 U, [7 h1 f9 J
做了两个 vector 和 两个 float *, 都长 100000
! H* D8 c/ F3 _: K4 t" U' g& O外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
7 |$ R. _9 S0 d& d: m" V- y% X: E' {! f; o: D
内循环试了4种方法,* @7 s) T) x" Q+ t* N* p+ Y4 Q4 D
1. 直接调用 vector inner_product 247s
4 s) k" J' B% l3 o* d" ?4 Z2. vector 循环点乘累加 237s" T- W2 o1 \" ]5 U! X' I
3. float * 循环点乘累加 204s2 E0 U2 O$ V) p) m }$ J
4. 空循环 100000 次 202s
5 Q3 d6 \2 P) K0 x0 a$ v4 b; |7 H
* I& e: A6 X1 R不做内循环 200s
* G2 M9 v2 s4 F# ~+ x/ i
& A: b! A2 V- Q2 s; l你昨天说的对,内循环本身占比是很小的,大头在其他处理。9 i; t/ R7 A8 a: L- ?; |
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
- U, C% P4 h* x$ n. [2 ?" j; R/ _$ q8 y/ p7 s, P: p
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
5 D9 J% l7 b D5 z& v9 n2 w3 a& V- y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
9 n& B0 r+ c+ d, o6 a* C, U' L! E% N, k. H' `1 f8 [) Q# z
std::vector < float > vec1(N);0 r) d2 Z8 l. v8 j. x
std::vector < float > vec2(N);, u$ |9 Y3 g3 t' R6 d7 c# ^
float* b1 = new float[N];
0 M5 x) K" l+ B& h% E! ^, c. c float* b2 = new float[N];
* O0 I; F( k6 R, M
, A, U& \9 ]9 _/ I* X for (int j = 0; j < 6000; j++)7 u: t* A& p# W3 M+ y
{% G d: f* O% P: p; ?
std::generate(vec1.begin(), vec1.end(), []() {
7 O S) o' L( y D. \) K5 o E return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;7 H3 y; g0 u8 I h
});* d" f1 H1 T1 L+ F4 T- d' b* c$ J5 Z
6 d$ z) [$ A# _. s
std::generate(vec2.begin(), vec2.end(), []() {2 @' h& b3 X# ~/ u2 A5 M Y! }
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
$ c; g/ y( c+ K" A7 H) g$ [& D });
: F* e" w( j" ^# g+ I' e1 M: _' ~/ ?5 I; @9 I4 M0 D# [+ y" }
for (size_t jj = 0; jj < vec1.size(); jj++)
l+ g* q O4 S6 x9 O {
( V1 `$ R! r1 l; W% D1 c: o7 m b1[jj] = vec1[jj];5 L7 X) F5 X2 T
}& b1 o0 @/ l! G8 S% ~8 Y5 Z
$ J+ O% V/ X3 q+ n; ` for (size_t jj = 0; jj < vec2.size(); jj++)9 D' x$ e! u- L& O; [# S
{
) L" v" P9 o4 V' L b2[jj] = vec2[jj];% y+ b3 f' Q6 a% R( P/ S( R! O
}
) D @* Z8 u3 C, H$ i; V. J4 ~
4 d+ Z, D& H( a6 ~" v9 z //Method - 1 N=100000 247s ' ]5 ~# r3 k' ~5 }' l9 j
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
9 ^6 M6 f h3 ?& w ( M T9 Z) G/ O! V2 g, }. R( j+ V
//Method - 2 N=100000 237s
# }( p4 |& |* w' Z! n9 M% U3 m% G /*/ n. }# F: A' V+ p C, _: c
for (int jj = 0; jj < N ; jj++)
8 J8 \6 O5 H8 v; {' S, r) D {, {2 f8 h8 x2 I* S
fresult += vec1[jj] * vec2[jj];
9 L9 {; y) Z* R) p R1 v }
6 m Y& N- w$ W" T */$ _. x8 B" B* f- u7 z6 x/ p
- _% r/ D' @, ]1 m7 _/ L8 [: p2 c
//Method - 3 N=100000 204s/ o y! I3 ~1 a5 U0 X' G( E
/*
8 ]! z: }: X! `3 @/ @+ c4 ? for (int jj = 0; jj < N; jj++)
1 ?2 {" Z2 R. [; L8 P( V {: r+ c" x, U. t8 V
fresult += b1[jj] * b2[jj];6 v5 o6 Y4 L$ {: E% t
}
0 e# C1 E& X# L; n& d$ O+ m */
% k1 Y4 h/ P f1 B
4 T# U7 a4 j" F, o$ Z/ F! R //Method - 4 202s, z2 g" d- _( q
/*; q3 x2 w- _( Z( z ]# [. L: f9 D
for (int jj = 0; jj < N; jj++)
; r: l8 Z1 R0 |/ W {6 A4 c! P8 U4 R9 P2 w% V8 e
# B; }+ J- A0 ]$ O+ P }
+ R9 K/ @1 o, L8 G" v, _0 |3 n */
6 c8 H$ t7 v: K# ? //comment out all methods, N=100000 202s 3 m8 F; u# W! O
}4 y; D- S; w" o) I' d1 `
$ ]: K- ~; t6 u V delete []b1;6 I$ ]" z: ?2 _/ [" j) D
delete []b2; & K a" _4 N3 N; R: |3 R
|
|