TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 7 @8 O6 n, O5 m; Z/ ^
! c' z9 T3 K. i8 P, L4 F! k: T
理了理思路,重新做了一个测试。! W3 d. u& N4 O# K* v
做了两个 vector 和 两个 float *, 都长 100000( G5 J+ r8 o. x- z% C4 X
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.3 m6 K: q/ d8 x, |5 O- Q
; o9 i) g( ~& `1 `6 |7 ?
内循环试了4种方法,
5 W; m2 K3 j8 g+ v6 j3 `9 Y% b1. 直接调用 vector inner_product 247s
; a8 M* q1 ], @2. vector 循环点乘累加 237s
. k1 a! U/ G0 V# p% v. j3. float * 循环点乘累加 204s, F! h! h2 u7 t ]* L1 n
4. 空循环 100000 次 202s0 R' U5 [" m- G3 U# ~, ~
6 d* H" p0 m. o不做内循环 200s
8 S& a3 x7 A( Q) {1 N B
9 J& W# w' D, o0 x你昨天说的对,内循环本身占比是很小的,大头在其他处理。' j: ?4 W5 u+ Y6 x3 v1 w% s8 g
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
# R% `% P- L* H* b- n0 A( d! U7 U3 a0 X3 D/ A9 k
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). p% e7 T( l+ ?" }$ |
8 D6 X# `7 P" x% T
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)- d" H7 b+ ]/ j$ {
" v- d/ C0 k3 V) w0 f std::vector < float > vec1(N);: u: z' D' `5 ^1 o* _0 n
std::vector < float > vec2(N);7 m9 n! w$ k8 `; G
float* b1 = new float[N];# G( |" l. _. c6 @. n# n" ?' |/ G
float* b2 = new float[N];
" x" T* f2 h9 p3 w0 r- U L
. l- b' J, T) P( @$ Q# M" f for (int j = 0; j < 6000; j++)2 Z8 S+ {3 I! F
{
; R; G) V2 `$ n! m4 ` std::generate(vec1.begin(), vec1.end(), []() {% H' U9 l/ y3 h( c
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;6 Q( k7 J2 |% M7 c8 @
});5 p* ~+ s3 ]. t# T) t
1 v2 Y6 {! b9 `( W' q+ c/ w
std::generate(vec2.begin(), vec2.end(), []() {
& d8 R5 y/ ]- C/ V" r# M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
% W7 C3 _ N9 k# W });% C9 O; J9 t. {' u1 Z) t% x9 n; C1 Z% R9 H
, P4 a! B5 f- r! x$ C0 K) ]0 _* o
for (size_t jj = 0; jj < vec1.size(); jj++)
1 L$ o4 L/ Q# V* k1 n# Z8 S* y {
6 R" i7 J* D# P0 u7 L/ B b1[jj] = vec1[jj];
/ m: X) H& G9 ^9 v8 ]3 p5 r }
- {; \" Q) G, S; `* X" ]5 l/ r X, P! o
for (size_t jj = 0; jj < vec2.size(); jj++)
9 l7 [/ a" P1 x( g6 ~" h0 e {3 R5 X, x4 q q4 H- ]' J
b2[jj] = vec2[jj];1 j* H H5 E8 y! T1 z4 ?6 A% @
}
; \* Z7 L+ s9 P1 x6 G2 }
. N# E a" x- s. O2 f1 B //Method - 1 N=100000 247s $ d" M: P u! T3 u8 I8 M) `2 c
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);2 E' [8 i" V1 Z
8 E4 b4 z7 T- A( K# o: M: j3 V
//Method - 2 N=100000 237s7 L* c4 a: |; }# _- F0 X
/*
; N4 `4 R( w, ?4 s for (int jj = 0; jj < N ; jj++)
0 y! z z% j' a" ^( _1 c {3 L8 s+ B: {% ?$ F
fresult += vec1[jj] * vec2[jj];7 x i4 y" L3 u: h! I
}2 D7 b4 R- x+ z; v2 [2 q
*/+ I% }9 L% P) }) d p
. g# b# y: J4 A# s //Method - 3 N=100000 204s, l& ~/ |% E9 y9 ~. O% e. F; u
/*7 x1 ? B. h# }+ ^
for (int jj = 0; jj < N; jj++)- h! E6 P4 v* d g4 e$ Z, r
{/ p( B9 b4 b6 _. r4 }- |4 F, Q
fresult += b1[jj] * b2[jj];
9 k, ^' R: }6 m4 U& T0 N }
' c9 }6 ^( d2 [- ?/ |- O */8 y6 @; ~3 P5 S7 A, |& w9 H; x
- J8 [- j8 Q7 D+ Q& Y u( j# _$ z
//Method - 4 202s- d2 S) V# i4 ?6 j: Y
/*6 a3 B4 i* }9 L# S, n5 t+ |" G% S
for (int jj = 0; jj < N; jj++)
) _: v% T) k$ w5 } u' d0 U {1 c* b$ d: S+ ]! _
- J) a( c7 L1 [% J. V& a }
$ T# E; D% [" E; f3 T% w, U' p, i */' c. c `9 I* l T
//comment out all methods, N=100000 202s & y* ], T+ S; H2 o1 Q
}: P. k/ D' Q4 P( ]! n' J& `
+ @! y) B( ^/ G$ s% c! G0 R
delete []b1;
( Y1 I; R: l' s+ D6 H delete []b2;
4 G( S" }1 ^! W* U1 p- [# g |
|