TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
$ ~0 b2 [+ N2 d" c/ ^7 D; ~& B/ J5 M8 c! ~7 ^2 t5 @9 W2 w
理了理思路,重新做了一个测试。6 D) d# }2 i# S" I' `
做了两个 vector 和 两个 float *, 都长 1000009 v; N* N8 x4 }$ F5 K' r; k% a! U
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
3 y. r5 p' D. I4 t
7 S9 k! B1 r" R; b* f3 A" x' h内循环试了4种方法,2 B, F. a# r' g3 f1 M, _0 w/ O8 `
1. 直接调用 vector inner_product 247s m: D `! x6 I6 s* i8 X0 N: P* c7 P
2. vector 循环点乘累加 237s% V% v3 Y+ x' @2 I- [' b; s' g
3. float * 循环点乘累加 204s/ l9 V! ^" H, m4 w u
4. 空循环 100000 次 202s, |1 u9 z+ I! z. v6 n3 W, W
+ ?+ w6 X4 w0 d2 p j% M! v0 J不做内循环 200s6 C, v. k2 f. H) m6 b4 v: \
/ S$ E. q: ~0 x4 H
你昨天说的对,内循环本身占比是很小的,大头在其他处理。, ]0 m4 `$ ]3 @; N# _8 Z
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。- U2 B7 k, g( f/ o
k/ N" w- b! s8 T
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
7 y7 b0 M2 ` d8 _/ h2 q% d& h' V7 f; t$ Z& Z6 L+ k/ Z
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)1 c r. f7 {, B/ i
, X7 s4 ]$ [7 T m& t$ e. X& a std::vector < float > vec1(N);, }6 F( f7 j1 Z( W7 X- u1 C. Z
std::vector < float > vec2(N);
Y+ Y; \+ p2 f. b float* b1 = new float[N];
; ?# `# c! r8 r8 ^ float* b2 = new float[N];0 J- e3 }- S1 U ~# G7 ]% E# H
; i4 z* z0 K: i+ ]; V. p' M& o) v for (int j = 0; j < 6000; j++) r- ~" O0 g. D9 m" Z
{& v1 W, R1 x0 O( N
std::generate(vec1.begin(), vec1.end(), []() {
d6 {- q& A3 a% t# g* t return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
) O% R+ c% V2 B' q3 \ });' G* q/ I9 i& w6 P
" K1 K1 L2 W* K0 S- C
std::generate(vec2.begin(), vec2.end(), []() {
& ]2 g7 {- _' U0 |) |3 { return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;. R' A" }/ Q4 K( X2 V! H6 O5 J
});
. x \1 @' H' Q0 O4 I2 Y6 x4 N) Y0 S4 b3 [. R
for (size_t jj = 0; jj < vec1.size(); jj++)6 _3 _# x; x/ z* r$ ]: x4 F) g
{
& S; ]# @$ T. g& U" P: n* ^ b1[jj] = vec1[jj];
& m1 L+ g& e0 _4 D/ S9 d }
4 t2 ]: L9 b. h v5 J) A9 o+ u, p5 k# Q0 q0 i9 b
for (size_t jj = 0; jj < vec2.size(); jj++)
$ X' u/ h0 l1 p0 ~( x9 \ {
8 G4 Q2 D: G# ^. ] r b2[jj] = vec2[jj];
O2 i( K1 t- n4 H& U" b1 Q- \ }
9 z/ v" Y, e( d# [0 Q6 _9 }' R& B7 B0 V) c; O$ {% V' c
//Method - 1 N=100000 247s 1 s: R6 I: r0 R; [6 l; p
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
" L5 x' L( |& S" f* M / c! p' M- \- q
//Method - 2 N=100000 237s+ O# }! N! T+ K9 C* ~) T$ h" T% p
/*3 H( H( {( x. K5 t1 Z
for (int jj = 0; jj < N ; jj++)' j. S: G$ `% ~6 |& y
{1 \# i, Q7 m$ }8 r/ r* m* y g& u
fresult += vec1[jj] * vec2[jj];+ [3 S; U% d3 s6 t- T
}4 z' m, F9 M& `& u3 l6 ^
*/
1 x+ \' X, v0 H; y4 w; X0 ~! z
! j. |6 x3 g8 L, F0 j; X: ~) G //Method - 3 N=100000 204s) _8 p" y9 ^; }! ]7 |$ w2 Z
/*
1 ]1 s9 b$ _9 C# y for (int jj = 0; jj < N; jj++)
4 y; N5 f7 D) `% d6 J; N# V% z {! ~& o; K$ [! |- u$ y0 o
fresult += b1[jj] * b2[jj];
, S; |+ r5 ]1 e2 R& {2 q+ R5 E }1 E& k5 c1 X g! i: z$ d" ^# b$ o
*/
9 Q& X8 T% ~2 _5 E5 g: V5 u) i" N# v. L& f% t. h/ w/ L8 H
//Method - 4 202s
- l% y+ U" f9 |) C: K) `7 k& | /*
) J. l5 w- N/ I% @* ~ for (int jj = 0; jj < N; jj++)
6 G) s$ O+ B5 m8 t$ C, I* Y* ~' G {
+ i% n5 f1 ^# J% |9 h - B7 @( h& g) A& V! v" P- j! ^2 y
}; o3 i( J* @& k2 W" s1 \
*/# m. s$ p; @# q E9 U
//comment out all methods, N=100000 202s
. f; y5 `' W8 ~3 A" ]7 X0 G ~ }/ o# q$ H" @) R( D8 F
. d! ]9 h& e; O1 } delete []b1;
, {0 j% q, B9 w4 ~ delete []b2;
A Z e6 ~6 F H3 L |
|