TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 ?; [" k( E9 ?' H8 M- c; @2 ~. U. O- ]# D' j9 E$ n
理了理思路,重新做了一个测试。( v- }" b. G; I: H: H
做了两个 vector 和 两个 float *, 都长 100000
/ E5 B- Y/ i. C/ a3 D! ?外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
2 N5 C0 b& x* f! P1 x% N( O# ~! H0 _3 S4 m! }5 k1 l1 k
内循环试了4种方法,
5 f" } Y6 R$ X# c! j1. 直接调用 vector inner_product 247s ( w# `; h) {2 I
2. vector 循环点乘累加 237s5 J$ e+ O( V: I) ]' U
3. float * 循环点乘累加 204s, ]. I. y3 I- j) v: N% f
4. 空循环 100000 次 202s
6 f ~' N/ ^; O& _, U% a! a3 t' {0 X1 t5 H
不做内循环 200s
) Y4 d! B$ d% V0 G# S8 N0 n" r/ U/ X& ~1 U' ~8 @5 S2 z3 @
你昨天说的对,内循环本身占比是很小的,大头在其他处理。: K/ s4 z ^) H& n% [
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。+ ~& T0 w2 m% s0 d7 b' V
8 D: W! U2 Q# a7 F, z P' S, X- w
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)7 Q! i4 T- o2 G+ L3 ]7 }
! O2 G4 S. u1 B& `/ ?. p5 h(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)/ I9 A* `$ e, |2 P6 w
+ e& F" ]' F; y% Y" ]* g
std::vector < float > vec1(N);( ]( M w: `& P0 G2 c& L
std::vector < float > vec2(N);. q4 q ~" w- m7 Q; c& K, o1 x$ H& m
float* b1 = new float[N];
( F: C) T+ K8 d! Q float* b2 = new float[N];
4 U4 l I+ G& ~# y9 h( `. n' R! m. ~! f+ [$ \
for (int j = 0; j < 6000; j++)
. h' e; V" {" ` {
/ t# X* Z, R# n2 g std::generate(vec1.begin(), vec1.end(), []() {( i3 S6 x8 F' J" b
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
. A, f& N3 F& v5 s7 V, |. ^( q4 k });
' K ]; e" u+ y2 w
" c/ H) e( ^2 r4 g! {8 \) G std::generate(vec2.begin(), vec2.end(), []() {5 s# g) G6 Y2 E3 U. ^* |7 U9 U
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
, R# Q. W" L: a3 c, d6 z });
8 u2 [3 j! h! P8 U3 b7 ^3 o' \7 P- H$ W$ M
for (size_t jj = 0; jj < vec1.size(); jj++)8 h& t0 c, I e- I0 Q3 X
{
9 u5 e' j% p7 ?0 i7 C: g/ E9 @3 D) T+ J b1[jj] = vec1[jj];
1 V. P& q' M2 ^; g3 G }
3 V6 g& V) @, O
/ k( k1 f K1 x: S0 `5 I& a for (size_t jj = 0; jj < vec2.size(); jj++)
( V5 O! x9 b" r. [5 Z, { { q% C( W" K l) u
b2[jj] = vec2[jj];
! X' |! ?7 z2 J }
8 Q: Y. o: L* \" J Y% u
; n9 _. ]( m& j& H m7 J //Method - 1 N=100000 247s
6 f, V: I( u) A7 P //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);3 h3 e r3 d; P0 S9 r2 Y6 h( R! M
' ]5 x; |# D+ g3 {% T
//Method - 2 N=100000 237s
: d6 n$ @0 k% S3 { /*! Q e3 g' ~" ^1 }" D
for (int jj = 0; jj < N ; jj++)
3 e7 s8 F) w4 `! W) @ c& \ {$ B- u& A0 N* i( S
fresult += vec1[jj] * vec2[jj];. m. X8 x6 C1 R" y2 R. I9 C3 v
}
" r! M: N- B! B/ C */
" Z2 _- N; X9 P# k" |, \
- M+ t- V7 T! ?5 n9 V* B% E //Method - 3 N=100000 204s
1 B, D# \" w$ j5 h) z& m6 P2 d /*
: B3 O8 k4 |. p1 S; d" {' I6 t for (int jj = 0; jj < N; jj++)! X3 _4 o& l+ D$ E! F
{. k' Y* ]8 I" s$ R
fresult += b1[jj] * b2[jj];8 \! [7 v# \8 T; R8 O7 W
}9 W! [# _! h1 H& J% Z% C
*/
D. J' v1 J) s2 }. H: i, x+ y% O: U* t$ t) ]; ^
//Method - 4 202s5 d$ r; @# Z- o6 M4 i
/*% `; ]! O7 }$ t/ r' k
for (int jj = 0; jj < N; jj++)
2 b8 \% Z; p4 \/ ]0 w' l* m) \ {0 v' c3 T' x$ r& B
% E- L5 z: k1 D& z }
% L. g! J5 K% ~/ A' B; n *// T# o Y( }# ?6 \# l4 g% n3 r! u
//comment out all methods, N=100000 202s
3 h7 [- g: {& h7 `5 e }) @" {4 a: G4 s$ E# a2 H
- j& q; r3 O4 s- ? E
delete []b1;8 S1 M* A0 {$ L+ l/ n6 A) N) a
delete []b2; * x* C+ v+ L( H( n p
|
|