TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 U5 v7 R" X" g0 w# z7 [" ]# l
% H3 ?2 d5 N @1 L7 b) T s
理了理思路,重新做了一个测试。
3 |2 m8 Z9 ~& b C; k做了两个 vector 和 两个 float *, 都长 100000
, v+ D4 c. v( I* L5 @3 D( g外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.& _; W, H. d- Z& Q1 E( _
: b8 z, J0 V* M0 O9 P
内循环试了4种方法,- e; `* i( U9 A6 @0 [1 a! [
1. 直接调用 vector inner_product 247s
4 s$ _" w8 u6 r/ s3 u' Q2. vector 循环点乘累加 237s7 N# b' J% R# x2 J3 f8 ?3 [. I
3. float * 循环点乘累加 204s" g7 q" o* }. E) O. g
4. 空循环 100000 次 202s
8 y% ^9 p2 s+ V! T8 g5 N' a0 Z
; p$ ?: L( z8 r; A+ f不做内循环 200s
. M" n& c8 Z# c% ?( b$ {+ \, W% `6 A+ @
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
% w" o. }; Z! D& {另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。1 o0 O8 q! N" O! k4 y) m
9 h& Z5 p( Y% q6 V" \- T* Y
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
/ }/ K6 h ^8 c. E. @4 d8 |, g" f" M; J( l( E8 F' O
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)' o8 p" s6 S2 V" t5 G% ]* f K
% X" \& u: ~: {( v+ s3 O std::vector < float > vec1(N);2 ]) ~5 L, E w9 T$ ^2 u
std::vector < float > vec2(N);
@6 X- R+ i* V) \ float* b1 = new float[N];
5 n6 ~2 H$ F; p w float* b2 = new float[N];
1 }# s8 s2 Z( N" C; ^$ _( W
. ?1 Q0 d Z) J8 j+ e for (int j = 0; j < 6000; j++)
W+ m+ ~& h- x) p& Y8 U {# N; k0 X+ g5 X# m" T( [
std::generate(vec1.begin(), vec1.end(), []() {8 f( A$ a. X6 U! z, I% O; A/ Z4 D: A- m
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;7 A7 x( z! _* D7 v! s6 M
});5 I! s% R n4 e8 I9 H5 ^
" L/ M( A/ i/ `! K8 g
std::generate(vec2.begin(), vec2.end(), []() {
( i! y/ G" [0 o8 I+ C2 ^# t5 Z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;' }( ?7 |" Z: [% C' U
});, H0 z6 i. J5 E; A( M" c, u: w
) g1 [$ C" L4 O* {* I! J for (size_t jj = 0; jj < vec1.size(); jj++)
# ~! Z9 i* ^; j- n# d {
# `" S3 O% j9 D4 { b1[jj] = vec1[jj];7 d& |( g" V J: g
}
9 J7 {2 @& K+ }' s; P* X% ^1 N# l D6 {8 \* _- X8 l- q
for (size_t jj = 0; jj < vec2.size(); jj++)
. G) v' e/ e& R U% o {& G% ]' j' |/ g" x4 O& o" G) |+ @
b2[jj] = vec2[jj];/ r+ U' d# R3 C9 D* y3 l i" \
}8 M% U! X* z/ \
7 e6 N( |, ?) k+ q //Method - 1 N=100000 247s
6 V" O% ?7 g3 E) W# F% @ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
- c4 F0 z P4 y 8 f/ \% k# z! v8 ?9 O
//Method - 2 N=100000 237s& x* Y8 S4 W* E4 E& L6 K; B
/*- L& o3 `- x) T8 X
for (int jj = 0; jj < N ; jj++)
5 s! Q/ p3 Q8 A: f {0 m9 G; C- w3 t. R: s: y7 Z
fresult += vec1[jj] * vec2[jj];! h x( Y U- h
}
* h! [; a* D& K" K9 h% z */& D7 a; T; ~" t: B
1 z: T0 t" _4 Z8 `' @+ L
//Method - 3 N=100000 204s! E/ B& \6 v6 f. C, D) s
/*5 A _1 W9 }) ~5 f
for (int jj = 0; jj < N; jj++)
. w) H. g. I+ l* B* Q: E, p {
- ?7 m( y9 q* @4 g' N fresult += b1[jj] * b2[jj];
5 a7 V( y0 I8 n }
% M: L% n' g( K1 U w( E% {9 _2 D6 v */& D. i# F7 M9 S. O8 N1 {/ R8 ]
# J K- |2 E% ]/ H9 N
//Method - 4 202s2 o* N: b+ h0 L" [- y: o5 l
/*
* R7 g; w, O/ {* `# {* v for (int jj = 0; jj < N; jj++)
r' ^* @3 j: u ?: X& {! ], a7 s {
8 D- G# q$ G$ U+ @ & I9 g: J8 ~+ }6 ^
}
: m ?6 i a" N) U */
8 R3 l8 o }( n' o8 W! U/ F3 F //comment out all methods, N=100000 202s : G3 _2 L; ~( }
}8 E2 |, u. U0 Q8 I) ]
' z: S7 k# T& e7 x3 J' }
delete []b1;- G3 U. t E8 A# Q
delete []b2;
2 D( `7 B v( ` Z: w |
|