TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
) x% K" }, t1 g, O
( ?6 ^" i- w! @- z8 U理了理思路,重新做了一个测试。9 x6 d# _& H+ L: f7 M. k
做了两个 vector 和 两个 float *, 都长 1000001 g% H1 b J3 g, o4 g2 k
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( [1 \" P) ]7 W& \
1 l, u# \* f! @* L0 ]% D: \/ W2 c
内循环试了4种方法,
$ Z1 p& @9 ^% i0 n( D l% i1. 直接调用 vector inner_product 247s + ?+ S* }/ B+ {/ k0 _
2. vector 循环点乘累加 237s8 P4 U* I& r: n
3. float * 循环点乘累加 204s/ d/ c3 j6 P" B9 u2 }. N
4. 空循环 100000 次 202s
- A$ v3 T: X! z, A- u. n
. q; P* _. v, o7 C$ R不做内循环 200s" ?# ]( b, ?& B+ A, m8 y5 s1 q$ ]
# W2 z0 f/ \# h' q* a% q* ^- h你昨天说的对,内循环本身占比是很小的,大头在其他处理。% N& m" \( b2 ?6 r8 E3 r
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
: ?% }( q1 k4 T9 T2 j6 M) S
! D' T8 o7 O( |至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)0 o$ Z3 T* F3 l* v
* P! ]$ c4 c) z k X8 K- J(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)' v6 ]9 q- _0 ]+ W! e# B- T
8 |$ M# {" P/ E" J
std::vector < float > vec1(N);
2 W) f' X) y# Q6 @ std::vector < float > vec2(N);
6 E$ G9 g! B# W6 h& O float* b1 = new float[N];
& I/ g) Y) t7 @' | float* b2 = new float[N];1 E% g" \+ c" U3 t2 d* g: e7 ?
0 y2 U+ I2 Y2 J: W9 S
for (int j = 0; j < 6000; j++)
d4 P5 _% T8 p. c {5 `8 D+ x% z, O- W; c
std::generate(vec1.begin(), vec1.end(), []() {
2 J1 ~& \8 R0 V1 n c! Q% L1 c return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
) ~) ^' Y" F! v2 {0 |( S }); S, c$ k% ~# W! E2 g4 ~$ M! }1 K
* u7 I$ s* U% T8 ^. g( d) b: L& ~ std::generate(vec2.begin(), vec2.end(), []() {
V$ [3 i, Z0 |/ }4 [ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
$ V6 ], U/ B& o8 V });
+ d0 C& X" i6 ]0 u! }9 T3 |# d9 _5 M% A ~$ J" `
for (size_t jj = 0; jj < vec1.size(); jj++)* ]. y% o; Y' h# o3 M3 B" w
{$ R* l! i( |" C5 r* E* K. p" E
b1[jj] = vec1[jj];
, ?( r% P: V$ E& [+ O* w }
1 P5 U; W6 p0 T8 H1 R0 {! T' n" q, @* \, D2 P7 }3 ^# @
for (size_t jj = 0; jj < vec2.size(); jj++)
; I3 X8 c# }( [8 q. R( i {5 f% J( n+ ^0 A0 K& t
b2[jj] = vec2[jj];
& U. o5 H- |2 |& j& @! Y- G' C }
) O$ N- }# n# U) N; p2 Q4 Z9 l& D/ x. k; D* h4 e
//Method - 1 N=100000 247s
|) ]7 x7 r& Z7 } //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);# `4 P5 R: W: ]% h6 I# X$ o
* J# m- s5 a4 o" E
//Method - 2 N=100000 237s0 {1 |& l% F# J7 L# [9 ~
/*
3 @* @3 U ^. L0 }3 V& V for (int jj = 0; jj < N ; jj++)+ _1 d4 @0 g# {3 A) A4 v
{
! Q( Z1 G& y% q1 Q fresult += vec1[jj] * vec2[jj];
3 V2 {7 h; ^! h" w& w7 R; H2 f }
# U. y1 b: Q& n+ C5 f" e9 O8 j */2 m( D$ [9 M2 K1 ` v
; ?% W5 {1 A2 |' r, u0 q3 [/ l# J
//Method - 3 N=100000 204s8 e- `) e1 Z0 d/ z
/*
5 x4 {% z4 U: I: y9 ^% f8 M# Q; t! G for (int jj = 0; jj < N; jj++)
. n, E7 t9 J# ` {
0 {* g3 M# R* n( B. \( W( o: A fresult += b1[jj] * b2[jj]; p9 |0 ^) X: A0 v
}" j# E' L/ o* t7 k2 ?1 [' m0 |
*/
- ]% ]0 s; O0 @- w. P7 V ]8 |8 x( a5 s0 ^; D( U% U: }
//Method - 4 202s
% v2 L: w4 G8 C- I M8 F /*3 N* L/ t# |8 ^) |' l& f. ~
for (int jj = 0; jj < N; jj++)
& Q, O# \* s; i" m3 } {" `0 ]" f6 v! f
' j+ o3 _( H/ f* v }5 I# W: d5 A9 X3 R1 o. {# S
*/
! o' r# w% E0 K //comment out all methods, N=100000 202s
& x7 w% k2 [: P* y X! X( e8 V }- ^0 I2 T. C; o) O, y
9 n( Y0 [2 j5 o) S delete []b1;
8 ? I5 j2 z( K7 w& P delete []b2;
1 d8 Y0 Y( S4 C; H7 A |
|