TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ) U4 t: _# e. x$ l; a0 Y
- K* Q1 F* T& y, o; p7 ^( v理了理思路,重新做了一个测试。) h: [* ~6 n9 R9 Q: j2 e$ S, y) T* O
做了两个 vector 和 两个 float *, 都长 100000
! X# U2 o, y I外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' r. O! b0 L. }% {
! `7 b, ^- s& g! T2 _ |. B( a内循环试了4种方法,( k9 u* x( p+ ^, U/ c$ O
1. 直接调用 vector inner_product 247s
1 H7 p' `; I2 [* D2 i2. vector 循环点乘累加 237s1 Y1 T& [6 z" {) P- C% k9 e, n5 G
3. float * 循环点乘累加 204s4 y5 t& K% c; L& E& w- w; [
4. 空循环 100000 次 202s
, [+ q* k+ F! \6 z1 n& Q
* u5 D+ b3 g$ b- m! j# v不做内循环 200s
& n+ }. K% x J2 U1 t. v5 R2 u9 G
( d! g, h: N3 _7 F k* `2 `你昨天说的对,内循环本身占比是很小的,大头在其他处理。
6 V8 h9 e9 D5 s0 }& m# O$ L8 f另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
, I, R# S5 o* S# ?+ F$ G5 b# O. Q, X: R! W# U% t
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( Q2 M' M. [$ a/ ?7 q# o% k1 y, H, w
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)! f7 d. F' V# R1 b W5 |% ]8 o
9 p- `4 K$ b" F& w& j) u std::vector < float > vec1(N);( _3 _, e3 s. ~. k3 C
std::vector < float > vec2(N);
8 f8 z( k" D( `4 n+ D* L float* b1 = new float[N];
0 m/ I7 O2 e2 Q- O) ^ float* b2 = new float[N];0 {: a# q( X) w4 {& Q! j" S
6 q: |* y7 N3 G! v# D
for (int j = 0; j < 6000; j++)+ C; y: ^, u& K( F( g/ R/ l- n; l
{% r' u( A/ f, U0 O# e0 e
std::generate(vec1.begin(), vec1.end(), []() {
0 ^6 Y+ y3 ]+ N) p" W7 |3 H3 V return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;# F5 n. v, U% Q, i b' c
});
$ c1 n- j/ J2 q
( w% Z' B( T e- } [$ g std::generate(vec2.begin(), vec2.end(), []() {
" w% g9 t! E$ d; i6 ~. q# f return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;0 F/ T$ [5 a- l3 W0 l6 d
});
1 v C3 v V4 z. e1 `1 a0 `+ N3 ]" y; Q$ D
for (size_t jj = 0; jj < vec1.size(); jj++)
# E' L. F) _% q {% `2 N: h I+ T
b1[jj] = vec1[jj];
; j; N9 Y$ B7 v1 m% ~6 J }3 `+ L' }2 K* Z; `# W- y
- l: Q" L6 ~$ h9 C. x
for (size_t jj = 0; jj < vec2.size(); jj++)
3 m; c1 |/ u/ [, ?/ b' D5 G {6 m" A3 v: N4 }" y- h
b2[jj] = vec2[jj];
6 R3 d' F# ^; B w4 A }2 W: O( S( X' l3 u- ~6 u* m
; N" [2 r k8 p6 Z
//Method - 1 N=100000 247s
' B7 ~, K U5 E //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ z) w$ l/ q8 |$ s2 R% _* M
Y" r& R7 A2 s/ n0 @: f% m( Q
//Method - 2 N=100000 237s
) Z4 n; k; y, R$ c( H m /*
' I+ G/ g7 W8 S- {+ \2 L for (int jj = 0; jj < N ; jj++)# y* z, {* z+ J* R% F/ C+ q8 w2 d" h
{: n) `; S. O& g- F+ K) v2 v+ I: y
fresult += vec1[jj] * vec2[jj];) q; C$ u, M' Q$ Y! t/ l/ F
}3 i$ [0 ? I. g+ v8 P3 A
*/, q" Y5 e2 H/ ]4 g3 Q+ u* A
- G) q1 v) [2 e% z+ x2 U+ z) h //Method - 3 N=100000 204s
& ^, B1 ~% w1 f, J( u# p /*
# X$ O1 e" A& f3 ]9 W: m, l* E for (int jj = 0; jj < N; jj++)4 a3 C: \& R. y; f
{
. }- L0 P/ O" W* @# w' s fresult += b1[jj] * b2[jj];
* X3 k4 G1 k$ Z) c% [- o$ V }0 o4 O( P- W. ^8 y$ F, H
*/' _! j+ z+ Y: j
$ n& p& A, V- M9 \ //Method - 4 202s ~5 e; `4 d/ j( E9 t; W+ ]7 y) ^
/*
* C0 z6 I) ~; Y" l9 O for (int jj = 0; jj < N; jj++)" ^2 Z, _% V1 m5 `) A- F( c
{7 m1 r. E7 r7 k2 y
3 ?6 `6 r+ h9 y2 j" |/ I$ O }
- @$ R( \* a5 W: y- {6 w* d */
& C8 t& e3 y* r+ S5 {7 G, h //comment out all methods, N=100000 202s . n7 y4 u& Y5 `3 @
}4 ~7 i" G# d7 I- F2 `4 i
% k) W4 r8 s3 B: x
delete []b1;
9 I9 D) x( l/ f" i# W, F delete []b2;
! |, I7 R) @) `1 w( \- J |
|