TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
/ k" t) B: W/ P. x. J$ {/ X I% J& m# \% q$ X+ q
理了理思路,重新做了一个测试。$ m" }* |0 K* P+ ?7 q! b" E/ L
做了两个 vector 和 两个 float *, 都长 1000005 P8 h& U0 E* t$ @9 i& K
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.+ R% I) N: L) q9 |0 |' G1 X: d+ c, u
' g* u5 O: c& [! Z6 _内循环试了4种方法,, B! I9 A* u1 e4 O0 N% G
1. 直接调用 vector inner_product 247s
( D1 D* w, a7 s3 T( s- t% I: o2. vector 循环点乘累加 237s
/ M3 Z2 S! {" }' M3 h3. float * 循环点乘累加 204s; W. z) q l8 c4 e7 ]
4. 空循环 100000 次 202s3 t; C7 K* P; I4 ]3 L
8 v/ p) p( J/ K% x+ m/ A不做内循环 200s
9 Q/ P/ j7 J0 W
$ X* K' W# B6 s你昨天说的对,内循环本身占比是很小的,大头在其他处理。
* [+ j% z, }! P1 |2 g2 z9 |另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
8 l" g5 i1 D( t4 j2 ?% k2 _$ Y& Y, _0 C
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). }( b4 I/ V/ W; C) k
9 e% F" B7 K4 N }% S7 v" \
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)) `! I6 B1 u, k; p# s
* K; o! S6 b" a+ W6 S
std::vector < float > vec1(N);' w3 T4 J1 d, A. _
std::vector < float > vec2(N);
" z: d& y6 s! k' I- k, J float* b1 = new float[N];
% D) X: M* w7 |! ?/ H; ` float* b2 = new float[N];/ P o4 ]/ _/ L3 I1 K, a! O& f# m
6 j. R i: j2 r( O for (int j = 0; j < 6000; j++)( f X2 V6 N9 `
{
' B' I$ \$ n/ L std::generate(vec1.begin(), vec1.end(), []() {
& h1 L9 G% Z" O2 e return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
8 ^1 t. H% w0 L7 x });" Q7 j, ~% |' w7 D
1 L" t+ f( C/ H std::generate(vec2.begin(), vec2.end(), []() {' k5 h, x6 c e3 X
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
4 O7 h2 w5 F: l7 _ });
' N" n0 p$ Q5 j8 P4 H
4 [$ B' f- {( I' N for (size_t jj = 0; jj < vec1.size(); jj++)/ X7 J0 ~$ ~) Z8 ~! |! T
{5 | c( H5 [- f$ t
b1[jj] = vec1[jj];* s5 D* ^& w, r
} {4 q k' Q4 X* T
* M+ s! `9 i4 `5 ?3 X# A B
for (size_t jj = 0; jj < vec2.size(); jj++)
1 w' f( n8 v$ ~, P* J+ h {
3 ^" i( \8 e0 u9 } b2[jj] = vec2[jj];* X3 d$ W( g9 o, M
}
' v' h: `6 v- H' E
5 T! W' C7 b$ K8 [ n) o //Method - 1 N=100000 247s
; k5 L8 L3 L% J$ R //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
& ]7 U3 d! s5 V+ u" |
9 [" _" _$ g4 b+ e //Method - 2 N=100000 237s& Q& p9 V x: C# d
/*
# i' g- ~% M N8 a2 X for (int jj = 0; jj < N ; jj++)' m; H4 U! g8 j. C2 }! A
{
5 x& J. G& C& h% E Q$ e fresult += vec1[jj] * vec2[jj];# R1 e! o; j3 H$ p, v: q
}# Y: t4 w; U" g8 r9 Z
*/
; W |7 d2 l1 \: D" Y' O+ y% X
) t9 t6 e5 E/ g; f4 @# t1 ~ //Method - 3 N=100000 204s0 f' Y. ` S9 m5 v' q/ d$ G3 D
/*
6 y0 n, |+ k7 L7 Q% L: a; r# C for (int jj = 0; jj < N; jj++)
2 } C. u; ?$ x) L- ]% H" n( {0 ~ {; s2 y2 k* B/ C e( `1 D# }
fresult += b1[jj] * b2[jj];
7 Y1 `0 L! ]% Y* h) G }
& r6 [% D" x3 N. {4 B3 [ *// C! l* {7 k8 D: |
g5 |/ w+ Z. c7 t; J9 o/ \
//Method - 4 202s
3 p- x( G! Z3 X) z) Q/ M( p8 t# ? /*6 y. |! b1 x% v1 l
for (int jj = 0; jj < N; jj++)! B+ d9 @4 o6 P
{2 O3 \" t! p) _ x1 t4 }
8 g* h" @5 H- x# O0 v
}2 s3 k1 t0 x: o$ X" ~, z6 a0 N- [
*/. G: ?" h Z: T/ |. O4 ~
//comment out all methods, N=100000 202s
4 }" q" u7 L* }+ a! x; l4 ]1 Z }
) w; k) ?0 ~4 c5 y1 X
% `1 u; K, ^' t; r6 ?* U& | delete []b1;
( a, A1 [0 A, G5 b delete []b2; # E$ p3 G; N$ h1 W W: A
|
|