TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
3 W! p% M5 _( P8 U* f% q6 f, r9 \
$ [ d' y& I7 J8 }3 [; J理了理思路,重新做了一个测试。
0 P& J. c$ }; x; q5 |7 C- _2 Q% x. _做了两个 vector 和 两个 float *, 都长 1000004 Q% u$ w0 B& q6 U
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., A. a) i( s" g D7 Z# x* P/ ~" q( Q5 z: _
' f( v( ~/ x1 M" T
内循环试了4种方法,9 ]4 [8 {' O; o! P: l, Z+ @2 f" K
1. 直接调用 vector inner_product 247s " i8 p' ^; M* a+ e/ i
2. vector 循环点乘累加 237s! O! ]. }. p" g, Q8 |* o
3. float * 循环点乘累加 204s
% g2 T+ P( a$ j' ?4. 空循环 100000 次 202s
! D: L6 j# F4 s2 V$ R
' B4 [, }+ W1 o; l3 b1 _) }% e不做内循环 200s% t+ V' s$ o- v" ~; |2 [ S
1 x; N" y7 b" v; f3 |3 e3 V/ {' [
你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 X9 J) H! D: l0 N2 w! G3 c6 F
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 @( r3 c6 N* c" f- @0 \) d
0 S& a z1 j! z9 A2 G$ y8 k5 b
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ K, J3 h! {3 w: s- T
& X! a; ` V6 p, D; k
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL), M7 M0 _" b" L! G% x
$ \0 U |, _1 V5 V std::vector < float > vec1(N);* A. \* M8 f& D+ {! e0 }5 N$ o+ o
std::vector < float > vec2(N);
- p8 o8 x5 Q) d+ ?/ T float* b1 = new float[N];/ {8 F) W, T+ ^
float* b2 = new float[N];) v: J7 O' z# P" p
! p2 q& Q( g9 z/ b. C for (int j = 0; j < 6000; j++)0 r. l c, ~2 x% \
{% p6 t) t, L9 N( q2 }- C5 F
std::generate(vec1.begin(), vec1.end(), []() {
0 n# ~) e' C+ E( s' `6 R7 _4 w1 [ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
( f6 b4 b8 T. h8 D$ P! y" k });; @ g* |; r6 a. k* p
3 @* ^! r, Z- Y7 n. v
std::generate(vec2.begin(), vec2.end(), []() {# D, Q9 g8 L5 D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
0 y5 T- L8 W: G% q- }4 x });3 a( F" H7 h& x
, t1 ]4 v% W. u' t3 ~2 {: ~ for (size_t jj = 0; jj < vec1.size(); jj++)9 U8 d9 i: w+ Z
{- v$ G q+ `9 o9 p3 k( _
b1[jj] = vec1[jj];( s) E R; ^4 H
}+ ^+ V3 u |8 W( e: K" T) `. F
: h) _/ n1 D4 p" k3 J
for (size_t jj = 0; jj < vec2.size(); jj++)3 x2 M" j6 G- ]0 c
{
1 o2 ?) H# y8 c& ]4 E5 p b2[jj] = vec2[jj];
- L2 q, Y( C- l3 O" P) i r }
* R, O2 W; i5 d. G1 [* I) P3 Q- H; i
//Method - 1 N=100000 247s 9 v" I# K( T5 _, ?
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ X3 _3 z Q% \
" I% e* n- `" z2 m; K2 L //Method - 2 N=100000 237s* V$ Y3 K {% Q: @2 @
/*; q; N6 c9 M, o; z# P3 D# Q* U E
for (int jj = 0; jj < N ; jj++): J% @& K: {0 K Q( E1 ~* ^+ X! D
{1 @# ~! \8 i+ z# x
fresult += vec1[jj] * vec2[jj];
' B/ b7 X2 _& C }
! q- d( v* Q" Q1 ~! s* l0 a */
" n: j: l# H6 r
% j, K! C% t9 b4 X //Method - 3 N=100000 204s
* m% P( k4 @. h9 F2 c /*- t+ _+ W* b7 n0 w! t# R
for (int jj = 0; jj < N; jj++)" a4 ]5 p) j" A" y7 V0 ]
{
3 B/ o" \: O9 m! n0 G9 b, S; J fresult += b1[jj] * b2[jj];
6 k% l& k2 q `2 J G* q3 [ }
" F* `) R( X, e! @ */
7 q7 Z& C8 ?. ]; q8 u ?
8 B: E- a( ]9 |. r. I6 S6 _ //Method - 4 202s
0 n( z0 O8 h9 ]4 X /*
9 o7 A; p3 v6 S1 u& ]# U2 f for (int jj = 0; jj < N; jj++)
$ l9 ?% B0 ~/ J u' Q4 F c( e9 X" P {
9 r3 M% N* P7 q w6 f# }* V
6 y/ K+ X; \% q5 S0 Y }+ {" \5 v" P, J( y
*/: q4 b; V% S8 N
//comment out all methods, N=100000 202s
8 d8 L/ m+ u- U. o+ `- p5 i5 o }
+ i* g* |% y: c6 \7 @& S- T! A$ j2 V& E7 V
delete []b1;) f! q0 \# I) A+ s, _
delete []b2;
* S. @5 B; G3 P7 `/ Z |
|