TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 $ ~* n% d% H, a3 R! R
1 {' @6 ` Z; f2 n1 e理了理思路,重新做了一个测试。; X/ C9 N5 v; N" T
做了两个 vector 和 两个 float *, 都长 100000. F+ h7 u$ J0 O! e( s0 u( u
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
7 B" U0 j- R2 g4 P
* K" @, n1 k# [' H) k内循环试了4种方法,
* k/ K. W5 v. Z. _; M" Y1. 直接调用 vector inner_product 247s
3 E/ w/ l, J8 @4 K" \2. vector 循环点乘累加 237s
8 t! D0 a7 d; G3 P. f/ P% F' q3. float * 循环点乘累加 204s
) o$ L, X4 I! {6 z- k4. 空循环 100000 次 202s
2 Y7 P, H! g$ s1 d, |
& e) u) T0 l' @ ?! A, U7 R不做内循环 200s& @ S- A7 Q- W1 F! D' }
4 S; k) l! S8 n' `$ \3 R0 D* @
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
3 b" L$ v5 ?# P5 S另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
& X5 V* E; l+ d: h+ @: J* ?
. r$ \2 @" _+ C4 \. [1 }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试) x+ r1 ]! _ d- x8 ~4 A
; v6 W0 o; Q4 B* q% W
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
. t8 H- t; M6 K; v( l* j4 m
; [9 h! }: T9 F/ C- W! y4 {) u std::vector < float > vec1(N);. ^+ R @" r8 k' G/ K0 W" }. ~6 @ c
std::vector < float > vec2(N);8 y9 G+ h0 H* j
float* b1 = new float[N];" t( h* `" {) y/ r
float* b2 = new float[N];( X! T% e1 O2 k4 b- t4 |3 u
$ _ m5 T- K5 |: K3 r& ^. p
for (int j = 0; j < 6000; j++)
: J% \3 {# i: x( H) n1 b {
# K* o: L$ P, O' m9 v std::generate(vec1.begin(), vec1.end(), []() { M# c+ v# z* q! H: [1 ]; f: H! n
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
4 [7 Q- q0 I8 Y2 m/ V6 o4 I! S });
# _! i5 l% o) \5 r$ u& O' ?& L; f
4 G% _! ]8 h6 s std::generate(vec2.begin(), vec2.end(), []() {& n; ^; ]0 K# a$ [3 d' }% x5 J) z1 S o
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
+ {( }! b! N" l) G });! `) Y& E4 \/ V6 S" C1 r0 J
8 u1 h* Q! i) t* [
for (size_t jj = 0; jj < vec1.size(); jj++)8 E3 f9 m4 ~1 ?2 u, j) k7 n; Q
{
+ x, p' e9 Q/ ~2 [6 D6 U: [0 g/ F9 O b1[jj] = vec1[jj];
: c. m; r0 @2 A" P( a }6 a I2 ?. w! g$ c2 N( t
. t7 b7 R6 L5 X for (size_t jj = 0; jj < vec2.size(); jj++)
5 r# H" G. ]; H {- j" B7 l A |1 |8 |
b2[jj] = vec2[jj];
! G1 Z2 H' |9 S2 J }
1 }2 [/ X5 n u
$ h d3 ]; s f8 i4 P4 x) B //Method - 1 N=100000 247s
& ?. @8 a5 V) d0 U //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 E6 S6 @# `7 N5 U3 h
% o h/ K, [1 G9 E" O* N //Method - 2 N=100000 237s
( t+ l" K4 J, B) M1 | /*
6 [' i# E: x0 J6 g8 C+ k6 c for (int jj = 0; jj < N ; jj++)
- d7 L( N+ p- G" _ {
9 K3 g& F, Z7 Q9 R fresult += vec1[jj] * vec2[jj];
6 \+ A! C1 X* h% M4 C( s" z( e6 \ }, q" }7 A4 O4 Z$ d6 N
*/
0 l! q- j2 d5 L% g5 Y ! F! \: p7 p' @- M3 p- o9 b4 Z
//Method - 3 N=100000 204s
) U1 U. T" ^5 M" W2 c7 m6 m' L /*
; p# j+ G1 z" F ?' @/ t for (int jj = 0; jj < N; jj++)
( B K- C6 i& \- `! l4 J {
; j7 u- F; z6 e$ d fresult += b1[jj] * b2[jj];1 ]3 r! x' S n' t0 X
}
$ f- A$ v3 I% b% R' s */# j9 |, B2 U( a" W! B( U' w
8 U. V- x4 n1 ~8 Z' ]: p! } //Method - 4 202s4 r% {8 m) ]# }8 I1 ~- v+ ?
/*
6 @9 v1 V$ r6 @7 |$ C9 Z2 e( R. _- A for (int jj = 0; jj < N; jj++)
. N) j' S: I5 I3 Y5 [. w {
+ Q Y( o6 _+ u D2 h
; k* | i$ G2 Y }
0 u: y- G" k S" c' j# E' N */
% p8 i% d+ f) y3 s( }" U. x //comment out all methods, N=100000 202s 6 Q# H1 A0 A; e
}
) W1 |- F5 l3 j
5 W* t: |8 h% T2 j R) q: u delete []b1;
$ h1 b: I! _2 [4 t' r! s7 a' f: h delete []b2; & a* [' l2 I6 B. [
|
|