TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
! O& `" \, v P+ l4 t0 [3 d4 [# Q$ a) { Q8 U. c$ k
理了理思路,重新做了一个测试。
! ?& B' e+ t! ^- J t+ M1 L2 i做了两个 vector 和 两个 float *, 都长 100000
! a; r: f5 m) A* W外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
5 `7 ~! k2 T1 I6 K' }
$ o5 ^& |6 z2 c' ?. k& Y0 L内循环试了4种方法,
# L6 |$ O4 e+ \% Q# H7 n- I1. 直接调用 vector inner_product 247s 5 Q. f& k; }! R9 ~5 ~
2. vector 循环点乘累加 237s
7 ]9 d [! N0 ^0 T3. float * 循环点乘累加 204s' {4 a" E9 X% T0 l9 u2 P& u
4. 空循环 100000 次 202s
9 N+ j8 e( X* I3 X* P' n
G T8 Q# N% Z# ^不做内循环 200s L5 w5 `6 [# F6 T% a- Y
4 [" K, k7 H/ j S
你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 l& r, }% i& g* e
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
. j1 U& }' W0 Q
8 C& L& C9 o8 I) i; [1 t% Y至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)1 r8 Z/ T$ c& Q
1 G$ d: [( d* c% K( K
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
4 T: @( O/ s1 _0 P
7 T7 p7 f) C( `+ W4 C std::vector < float > vec1(N);9 f6 o$ s' ]" r0 N( ?. W
std::vector < float > vec2(N);& t( H) K- q' w! L7 y
float* b1 = new float[N];
" w! w4 y+ s# r9 H$ A' z float* b2 = new float[N];
; V( }7 m' y# L- a% c% n; L' `$ k/ u- p( o) q- K
for (int j = 0; j < 6000; j++)* u4 F+ u9 M1 W0 m( F# ^
{! A0 l- b8 }1 m, \8 h. @; \) b J& W
std::generate(vec1.begin(), vec1.end(), []() {
3 S9 T- {+ m4 Z" B* }: H return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;7 C$ N7 @# P. a8 T
});- F$ k t6 z/ o' p8 h/ B& ^
( X! [2 X% O$ g( k' ~0 p% @. e std::generate(vec2.begin(), vec2.end(), []() {) U7 M7 j3 b+ ^' ~) Y: u
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));; c# W! J+ Y P( e) X$ ?6 c
});
/ w$ E, `4 M/ B% b* R
2 [. |; P! \1 s v/ i+ A. K$ ^ w for (size_t jj = 0; jj < vec1.size(); jj++): T$ u) i: A+ p, |* |. E- ?
{* f8 Y5 q5 h2 L4 V+ J; t
b1[jj] = vec1[jj];
, ~) m0 y) r |8 q S }4 K- b7 J& ] N
5 g! |+ b+ T& j for (size_t jj = 0; jj < vec2.size(); jj++)
, M0 {; V+ ?; `# R" I {
. ^) r/ `6 c- J8 {' T+ Z b2[jj] = vec2[jj];$ ]; M& `& e4 r
}
. x( o. _3 U' Z* B
# F- L- }* Q; X9 _6 n' A //Method - 1 N=100000 247s
" [% z b, n# | //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);/ Z' a1 }- z5 s% O6 M' Y9 P' W
- n0 a* N' l# {4 s. v //Method - 2 N=100000 237s
% T$ |4 i- P2 D( Q/ h0 u /*/ l& m" I1 L5 Z
for (int jj = 0; jj < N ; jj++)/ n" D- l# f9 N S* y o
{+ L" n" |, [3 v( R4 e0 P' W t
fresult += vec1[jj] * vec2[jj];+ y {3 `+ K8 H. X5 @
}
5 e9 T$ I" z1 Q! W */
! \! v D7 R: O' ] 1 P0 M1 F3 D# [ M1 h3 O" ]/ g1 z
//Method - 3 N=100000 204s! g3 w4 i% z& R6 j6 n4 E/ e5 S
/*5 [" R2 _! j4 `
for (int jj = 0; jj < N; jj++)
' a6 G. u, o2 n1 } {
$ I: b# {) Q# A7 E& s" z; A fresult += b1[jj] * b2[jj];
( ]; V2 F+ M" j* v }
5 y; W! S8 R0 Y; _ */
0 F4 _* w6 y: n* t2 q5 t+ v# E4 D% |
! ~2 I; b) h E4 A4 a5 c( y7 ^ //Method - 4 202s
! A& d8 @/ e9 I /*% r( Q, y/ S% I, K" |" u0 \
for (int jj = 0; jj < N; jj++)
0 S% k3 z' d0 T/ @ {
, E) {. x# k7 U
: P3 Z. f7 Z! m1 d1 U0 Q: f }
. S# }; Z! m6 T; y n M */
A, o5 g8 M \3 Z //comment out all methods, N=100000 202s
! b; r8 {% h( R }% @: ~! U1 j/ M3 g! }, P
1 J4 }0 a F) r2 q1 s delete []b1;
9 k/ d5 D4 _ Y3 S delete []b2;
; s* m# X% M J$ Q8 X! g |
|