TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 / L" C$ B4 ?# K/ K- n9 C* u0 f
: C& A3 q2 H# A0 n+ f
理了理思路,重新做了一个测试。
/ g O% V v& t1 H, y做了两个 vector 和 两个 float *, 都长 100000
$ n$ n. w+ \( ?外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
- A1 n- K3 C C) t5 `) a. F+ w% k6 v/ O2 N) a, y- X
内循环试了4种方法,7 P: I0 q0 M& i5 ?
1. 直接调用 vector inner_product 247s 1 S3 q& K6 r) t; Q& y6 ^
2. vector 循环点乘累加 237s
" T% j. n! R2 r( J2 `" D( ^, V3. float * 循环点乘累加 204s
% s$ U5 {& ^0 j' }6 R" k5 Q* l4. 空循环 100000 次 202s# f7 Q6 S4 {. n8 L/ e
- S7 |1 ^' J3 o ]) r; y
不做内循环 200s
% _ b: P$ U& B6 y5 ]$ D; R) r4 [5 r3 Z( c, ^
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
+ T: B0 u3 h5 [. ?: d2 ]另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 ]" n2 K9 F$ W- F* _: q+ c* @; U
' L4 f# g2 j. O! q/ H至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ q! D: X% O! X+ m; Z1 |
, q/ V- O* A) k" J- A
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
, N- \, N0 S% P6 K
, L" K% z: c9 G; Z- }2 `/ l std::vector < float > vec1(N);
' z' N$ r# J1 S& i, a' P+ M std::vector < float > vec2(N);8 t* e O# v u6 H3 t0 V# E
float* b1 = new float[N];
7 U( |' T% K" K t+ i, U6 l float* b2 = new float[N];- U9 L9 h; I* f
1 J( {+ J5 G, |" |& O, P for (int j = 0; j < 6000; j++)
( N1 _. _) k2 l5 h0 F1 [6 T. ~+ r( K {2 O/ {/ }" n& F
std::generate(vec1.begin(), vec1.end(), []() {
$ l! N% E1 C9 L- s; e return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
% u+ I7 K: e& |, T: T/ ] });1 ^& o6 R; H' j/ H% ]0 H( B, K
# M/ B% G8 g5 B! g std::generate(vec2.begin(), vec2.end(), []() {
' W% l y9 x# O4 w. s& B return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
; U1 w- J. s4 F( q X; L/ T });
& n8 j. X- C' X, h1 d; W( d! X# E# r4 q2 U6 B. ?
for (size_t jj = 0; jj < vec1.size(); jj++) x) }9 I3 D$ N% |
{
; L8 X5 Y/ U9 U b1[jj] = vec1[jj];
7 g) [ _' G; L1 Y }6 y! D! o% ^& Y; x0 o6 a
8 f1 q8 N" d" C( b for (size_t jj = 0; jj < vec2.size(); jj++)
* D: ?# L0 k& s3 F/ _1 S {
2 v' f3 y5 i( b b2[jj] = vec2[jj];; y% B$ j% K& T' W6 \; A$ n% @
}; \6 {5 [9 u2 Q) a d) L
" E1 D$ }) M W/ a! I, W* x) Y //Method - 1 N=100000 247s , p. X) L1 a0 g2 n) t
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ W0 q+ q4 [2 G: X# c+ Q
4 k$ `* ~! p( J //Method - 2 N=100000 237s
" F# {/ K9 G" U6 o+ l; ]5 _ /*
: n8 [! l8 `. h- h for (int jj = 0; jj < N ; jj++): L) O& S1 Z, M' N
{
: l% E. M# [% y8 ~ u' ~( V fresult += vec1[jj] * vec2[jj];
5 X! p0 _4 z8 M }; Y! U: b3 x, ~2 ~9 z* C2 B
*/1 n; h& ~; ^* i b; ~! ^- A0 E7 b
: O/ y) c8 e) I3 f1 u3 w
//Method - 3 N=100000 204s
A! i0 I' S6 x: O" E /*5 [) y0 O% D {: P" c
for (int jj = 0; jj < N; jj++)
9 V* i8 w, R- P {
. Z6 E9 g/ b9 i fresult += b1[jj] * b2[jj];6 m) s& Q3 |4 P E& _
} A- g1 Y! t5 C5 I% G
*/7 B5 Y' D. k) l3 ?' X% S
1 Z2 h: I: h0 l! ~; W/ \ //Method - 4 202s
' m5 Q. R0 p& u5 O. i. \) @8 s( N /*
. z G# B4 a9 l2 } for (int jj = 0; jj < N; jj++)
3 l/ O. t# ?! b" P {$ q$ O l4 E9 H$ f
8 ]/ h1 K8 U9 o& `7 j; H8 u# [ }
* p# V! z+ y4 A; E */& ?6 `; E2 P" c9 E1 ~& Q( D
//comment out all methods, N=100000 202s % D2 i$ j9 d* [3 ?& l
}7 I2 z2 r0 Z: l, i( U5 E
' R! S) w8 E( r" t* [6 i2 K2 M
delete []b1;, u( v# J+ E; N$ A" W6 A4 k
delete []b2;
! a4 t9 H- N- W' r) ~! t: F |
|