TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
+ H- E3 F% Z, a: C. S, p: I/ Q: R* O
理了理思路,重新做了一个测试。
* R/ m6 G) [' h: N5 R; O做了两个 vector 和 两个 float *, 都长 100000
j6 d) `. s& Q6 M6 g! w- P& y外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.& x: q* c" i) u. ~* o4 @
! z' a2 `& A) l/ \5 t- N) R内循环试了4种方法,6 x! o5 S' g3 m% `: o
1. 直接调用 vector inner_product 247s
% Q1 ?! W6 N; r. g3 F2. vector 循环点乘累加 237s
- ]' j3 P5 Y3 O h5 {3 w) B3. float * 循环点乘累加 204s. D1 r4 X/ L7 D. O4 B
4. 空循环 100000 次 202s
; M- B I" X/ R' X- l& t% G2 n2 z. T0 W0 r( j+ G/ ]2 a
不做内循环 200s
+ |, J# k$ ~5 S# _0 U8 S F$ e6 ^% Q' o) a( n# j( c
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
( e1 R/ x0 b2 @3 H/ O另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。+ h0 H) ]% `8 q1 f
; f( k8 u' t+ h9 V/ c$ Y
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ `0 G, M2 L8 t5 M) Z
, x( Q' }1 {7 c" w
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* f. `% @% B8 c4 @- R- c
* t: b0 S/ y+ f" m7 x std::vector < float > vec1(N);
+ j6 z2 X6 N$ w std::vector < float > vec2(N);# y5 \& k, @. Y/ Q- K
float* b1 = new float[N];" P: k$ A0 N* c/ a: n
float* b2 = new float[N];
/ m: X$ z8 g" q( g4 J
5 Z- ]. D4 l# N. M, C for (int j = 0; j < 6000; j++)
1 M' @0 i% z& [ {
* O, P- A0 a' S+ ?# U+ g. ~% V std::generate(vec1.begin(), vec1.end(), []() {
5 P7 y9 Z7 \' R1 h- E return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;. p) u+ ~; ?2 y$ v2 a1 b6 N |* E
});4 Z/ ]2 p1 z# i' ~* \
2 y* M0 _ @! _ std::generate(vec2.begin(), vec2.end(), []() {
$ Y# e% R/ D4 [- A0 Q% D return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
. t+ f8 ]( ]; V! }0 H7 [1 ` });
( K. D/ s& R9 z) B Z# K1 f! \/ F) n- `/ w
for (size_t jj = 0; jj < vec1.size(); jj++)
. G1 M" ^& t6 p( P" ] {5 ~" ^" T/ D: n5 r ~
b1[jj] = vec1[jj];% _0 A/ g$ p' y- T! S' Z' @; F
}
" ~7 J: K O, u+ Z$ M) \9 V( o7 C4 A2 u% e: s
for (size_t jj = 0; jj < vec2.size(); jj++)4 y7 u' G7 `- o o0 K2 \( F
{& j. S! s- u+ _1 Z7 }. n/ X2 L) C
b2[jj] = vec2[jj];
2 C) Z! Q: r4 Q3 ?/ { }* W$ K; z+ N5 E, |, T: a( S
. @- y4 Y) \# @
//Method - 1 N=100000 247s ( ?' d1 f) q+ Z+ p- K8 x: B& Q
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);9 Y$ B( k* }8 T9 g
$ O5 ?' w+ g, F0 h5 l! [; `/ T3 R //Method - 2 N=100000 237s5 G4 H7 ?6 O. `. ]! f, I) w; N6 Y
/*. h$ A2 q9 }8 p5 g! k, e
for (int jj = 0; jj < N ; jj++)7 u( s7 f* o1 X9 i8 B* e# E
{( B, ~" w) e5 k$ `
fresult += vec1[jj] * vec2[jj];
8 k$ r" N3 t# k+ c }$ u% I" H7 o, R* f5 H, [. d+ R
*/
3 G% c# R- I, y0 A0 L* S, T
+ [ J& t8 s d2 z& U //Method - 3 N=100000 204s
. e7 ^$ K& c) |5 N: x1 { /*
4 h0 @$ P9 ]/ l2 D5 k' j* F for (int jj = 0; jj < N; jj++)
" j3 f- }3 S1 r) x& {( C0 ^2 |7 E3 T {( ?1 `3 z, [0 T% q
fresult += b1[jj] * b2[jj];
: Q( Z; |. i1 P* U1 K0 a1 ]9 c }+ v7 ~' L6 g: w) ~8 @* l
*/) B( l9 P+ k/ D, `7 q1 k" L3 j' a
! V1 q4 b3 ^. P7 W. d- X- E" e. D //Method - 4 202s
& |* [0 B* h5 c/ t/ n- q6 x /*
; \+ P1 y$ z3 G: A0 H1 [ for (int jj = 0; jj < N; jj++)
1 F3 m7 f, x' ` {" ?# _) O$ l. r; L9 }* j
2 C% U, e N2 R }# `1 J. [& f# S7 B9 V, ~
*/
1 v$ p a: M5 @ //comment out all methods, N=100000 202s ! P/ o; @: U% [( U+ S
}
* n! p- L( ]5 |+ x! F j
8 E- P: ]5 p( E7 o. t2 u' J. ^3 \ delete []b1;$ z6 |6 Y t& |. w! ?6 i
delete []b2; 9 N: `& h& f+ `5 \6 s
|
|