TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 r" s% O* F/ |3 c# Y2 D1 ]
. A& k0 w5 \2 V" w( m7 U- R
理了理思路,重新做了一个测试。 V7 h# w# P. k0 N
做了两个 vector 和 两个 float *, 都长 100000
5 d+ ^& G7 J/ ]6 g O$ s外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
3 t7 U- } I! L- m! g" z% {, @2 g+ [# }
内循环试了4种方法,
9 F o- H; u2 ?& t: N2 W1 m1. 直接调用 vector inner_product 247s
0 I+ q/ u0 c) B: g2. vector 循环点乘累加 237s
5 s' ]" r, I f4 L" ]2 ]3. float * 循环点乘累加 204s
# `# w8 a% L8 I; a& k d# L/ u4. 空循环 100000 次 202s: x3 Q1 I% @2 }' X
. ]( m8 I- O8 l( y4 R" z* \
不做内循环 200s' y, v) }9 i2 g/ {& g% g
, y4 B+ P1 g) Y* I) @
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
- `" r' O" u8 ]' S另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 O3 V7 a$ L3 e$ l1 \, o5 `
/ S/ L( W0 v% U3 a7 z至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)- F' D0 y5 ^; e. ]: K/ `! S! ]
8 T% |8 _; d/ w# _9 O
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)- f: c! u8 g, o+ I
; Q* {- ~, ^" O- v& \ std::vector < float > vec1(N);
2 k$ o2 U, K! |* w# f std::vector < float > vec2(N);& Z% Z% H @) o, h# ^3 L
float* b1 = new float[N];3 O# x, P' d( v
float* b2 = new float[N]; P; L4 V3 g) [* L
3 C9 U5 z8 a/ `' W0 n
for (int j = 0; j < 6000; j++)
% H4 Z# Y" T j, q( ? {% v2 g( p( o/ o2 V( o
std::generate(vec1.begin(), vec1.end(), []() {8 Q- g3 ^( a" @% f. r* L9 M: h
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
, t1 {: f# p9 b. n });
h0 A& g# {4 H2 o/ I
& k) \' E0 S" R# f/ h4 W std::generate(vec2.begin(), vec2.end(), []() {
: I9 E9 E) T0 t& S& Y, \ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;+ Y; \( |1 G/ h1 C3 \ y2 u
});1 ^; }$ R) g/ U6 N/ s' F
K6 P ]# {" ^+ ?' _
for (size_t jj = 0; jj < vec1.size(); jj++)
# t5 i1 i( B2 {$ C! m9 ? {+ q: @/ k m- x$ S( V' |! m: Z
b1[jj] = vec1[jj];
$ S7 a8 l2 \* Y0 a& q. @ }/ I/ W" R8 u1 p4 ]/ \3 i& M0 {
0 j% K0 N, q! ?6 g7 u1 w7 a2 p2 X for (size_t jj = 0; jj < vec2.size(); jj++)
' N7 e2 C% k+ Z* e) c# X {) Z* H# s! g6 J: x* _$ I
b2[jj] = vec2[jj];
3 C; I# j0 h) c8 f }+ ^9 Y% |1 F6 a. P
6 {8 B: Y N6 ^* e
//Method - 1 N=100000 247s ! @4 z# L j! m8 ^; F/ r
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0); F4 ~+ O& f, x0 ?
: s6 a2 p( u" T" {4 g //Method - 2 N=100000 237s' n% a$ ]* O8 `! Q
/*
( ]; W4 D5 m+ \7 m* s/ m for (int jj = 0; jj < N ; jj++)
! G1 N3 N) o; c) f0 f3 X {
8 C% t; a7 ^1 @- X, M fresult += vec1[jj] * vec2[jj];# t2 P$ Q* L/ J# ]' S, D
}9 c: g, c( C9 ]' ?$ v2 L7 Z8 o3 E
*/
2 e& ?) r( r# N( j2 B6 v) o
3 x2 u1 o! x1 j4 L* Y6 L+ m //Method - 3 N=100000 204s
! l# u2 c/ ]/ o4 S /*% f ?! E0 L! ?! k5 s$ k
for (int jj = 0; jj < N; jj++): q9 f7 ~; O" `$ X: y) o
{
- k$ [& m/ M" {3 a& h8 N5 `3 R fresult += b1[jj] * b2[jj];7 _; m! w, w8 O& q' [+ P8 q
}
3 s6 p- c& V2 r @' i */
; i' h& h& i% Q& w! L8 A% @
3 a" {( y, g- m1 J* C+ d0 |% S //Method - 4 202s
% E5 { s. b) b! M* \- U /*2 p `+ q; p# r& E
for (int jj = 0; jj < N; jj++)
1 X8 W0 p$ o; w) W) p, X- s0 { {
5 T9 ] m- Z/ o2 f) K" m* ?
; T+ T& Y, R- Y z) V ?5 v2 q9 G$ ~ }
0 D- g+ g f: p9 }7 Q */
: i& Q- d9 U. x9 s# B4 ^, \ //comment out all methods, N=100000 202s & Y0 }8 O' }4 ~" g
}* D* m ^' t7 c7 ~( b
! g! p- k) w( B9 n& R ~0 Q9 n delete []b1;4 [( K* `" u1 _; }) d. ]9 m; t
delete []b2; : C3 V9 T7 j* f, p& K# _8 P0 V
|
|