TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
8 S, v7 \+ S T# _6 T% k: O
6 E* c/ p8 @: z4 |理了理思路,重新做了一个测试。" a& s5 u% S" h; _
做了两个 vector 和 两个 float *, 都长 100000- H# p6 P: F$ g) ~) Z% V
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
- h I x( B- j4 y4 @/ G2 S
$ ?* O- h6 k5 K4 L7 O内循环试了4种方法,
/ u8 ^) d+ q; z, u- ~6 i1. 直接调用 vector inner_product 247s
& w. z- m8 k U) T7 c4 D8 Q& f! Y2. vector 循环点乘累加 237s x, E3 b- u" o% s3 K1 s! S7 e
3. float * 循环点乘累加 204s8 D! M7 c" F& o! H2 f5 [5 R* h
4. 空循环 100000 次 202s9 e) j( ]8 X0 [# Q2 Z" ^
, ]+ S8 z! r# n' i- [+ t
不做内循环 200s
, `. |, S& K# K' E# |+ V+ m* l- ~; h! `8 [8 {! v
你昨天说的对,内循环本身占比是很小的,大头在其他处理。, i' B: O' n* S* g; b: M- y
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。. n, \9 M* l k0 W) [) ?' h1 J ^
0 V6 g4 j6 Q6 U) m* t5 J1 Z0 _
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)7 q' g) e9 f7 g# e# W( b m
" V) ^& _$ A3 ^8 \
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
! I7 T% E$ a; L; ]7 X
7 [1 ~4 M3 ~" k$ Q& d' E std::vector < float > vec1(N);
1 I" Z4 Z3 u2 ]' E std::vector < float > vec2(N); `# {; K5 `. j) H
float* b1 = new float[N];5 L% z# R& D. J( @. c
float* b2 = new float[N];
% w# _2 n4 E# P. w$ H, h& C! f2 T0 G% O; j. `! T8 c
for (int j = 0; j < 6000; j++)2 K) `( B! o' M U) T4 |. l! D7 N
{
/ Z& h3 D% ]4 P4 S( ^2 C std::generate(vec1.begin(), vec1.end(), []() { D" d8 \- k1 h, j& Z9 S
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ H# K w& M6 W" r* h9 L });
N& z- ]) K( t& e3 `* ?4 r1 U8 i
std::generate(vec2.begin(), vec2.end(), []() {
B- P# m9 }* R" j+ K2 Q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
! B# _* _9 {" A7 C });
" m/ h8 u" `7 G3 A n
6 q: J* Z" M ^4 j for (size_t jj = 0; jj < vec1.size(); jj++)
0 w1 A' d$ `; T" L {
, l: b2 k. _( r b1[jj] = vec1[jj];5 j8 c V: b" g: x' S( M, V, n
}6 s' ?5 G0 @8 o" ]
, {$ u. |) a% E+ ~0 M+ y( L0 z' N2 H for (size_t jj = 0; jj < vec2.size(); jj++)
/ ?5 O0 n$ ]3 y I2 z {
: t! T3 {. ^& U W1 @ b2[jj] = vec2[jj];8 q _& F6 g4 F0 M: q2 Z
}/ Q6 ^" \) b. J4 T. v U: m: x
: H2 S$ F& X) C% [, c! x; y //Method - 1 N=100000 247s
3 I0 B3 s S9 ^6 F4 P% h# b% Y //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
0 J5 I6 A& J4 O' W9 u( f 3 b: R9 d v# }9 g/ j
//Method - 2 N=100000 237s
3 z% K) w% R, J: e! J /*- V0 q! o0 y9 ^% v
for (int jj = 0; jj < N ; jj++)
! H8 T% e* N6 P$ m {0 p2 W2 G& u! B% d* |0 y
fresult += vec1[jj] * vec2[jj];
* Z1 F* Z! O: c7 Z) Q9 e6 ^ }+ h% Q& w, j- f! R6 f" Z1 n
*/$ ^! R/ j7 i) R7 G
- f; }& h( E8 o& J- [+ Q: k5 M4 P
//Method - 3 N=100000 204s
, _6 K7 y% b A [, O/ l9 U) T /*( D! ]/ k3 F& _8 }1 z# N* ~5 q
for (int jj = 0; jj < N; jj++)
5 Z0 A) g- Y6 p1 Q6 Q {
/ | {% w+ M2 \' ]. ^6 p+ q. W/ I fresult += b1[jj] * b2[jj];( d5 x0 W# D# {1 V2 I
}
+ L% m3 ?% V/ c$ g, U- ^# ` */
% ^% ? ?$ [ k0 ^* I
0 G% g2 l1 j; {2 U //Method - 4 202s
4 H3 v5 m+ ~1 t- t: ?' m5 A5 C: r5 B /*
- z5 J- C' N q" B6 ^ for (int jj = 0; jj < N; jj++)
7 J0 s3 {; p& |8 ]' h7 u {) v( f6 w5 | z+ Z) ]% |; R; _
& \+ V$ z5 X z8 N }
& a5 }5 ^* o( n" b+ C */
2 W) _, ^; c1 U$ {7 [$ c6 Q //comment out all methods, N=100000 202s
1 a: O9 k9 ]) ` }( a& M J, v: }/ q: k- Y( ?( k
# A. j, g" Y/ @: i0 `# }3 i% z7 m
delete []b1;
; X- I4 h/ j+ z' P! I/ D* u delete []b2; % V/ c1 [9 y9 ~7 ^' @1 Y$ X: j- [
|
|