TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
. ^7 @* v* E# g+ J5 D* u
! Q1 @ ]& f; v* ?+ k理了理思路,重新做了一个测试。: U* R1 p9 Q: N1 U
做了两个 vector 和 两个 float *, 都长 100000. o8 z' i7 v* t/ y
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
5 `) D4 }9 W# c, n7 L- M7 w% y* I. `6 R- k1 k2 k" D
内循环试了4种方法,! L! l6 y/ d2 g: D0 u/ B8 @
1. 直接调用 vector inner_product 247s 3 t0 h3 p4 x7 ^) e1 u2 b" [
2. vector 循环点乘累加 237s
a) |4 f2 h4 P% ^$ G3. float * 循环点乘累加 204s" Z. p3 r0 A3 m) X. N7 K
4. 空循环 100000 次 202s
& ^6 |6 S) V3 L; ?2 j- Z9 M
1 I5 i( U& X- a" |不做内循环 200s$ C9 L$ s) B' q0 n
# [6 ~5 c5 a8 ~+ r6 F1 y
你昨天说的对,内循环本身占比是很小的,大头在其他处理。; }' b. }- a7 M f8 k% S3 y; R; ?
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。: k/ y; v. W# l& R* H" U
! m9 y: d; A9 g$ K. \9 A/ F/ V
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试), `- \6 J# v9 o2 m3 }
( f8 j V1 A9 U8 f% }( {+ p
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
- T$ A& g: Z3 s% _* B9 J6 Y, w# h
5 |, x% H4 o8 \( F7 y0 }9 x# o std::vector < float > vec1(N);3 N# e: Z1 S0 v" f3 v
std::vector < float > vec2(N);
% h& D. D* H' N$ ?8 ~$ l/ h float* b1 = new float[N];
r5 X7 Z" b( m5 _ float* b2 = new float[N];
# k9 x3 r8 H# o- I. d# W4 Y# I$ E* K5 q0 y4 w% S( w z" t
for (int j = 0; j < 6000; j++)
) B$ G# q$ ]. f6 ?: ~' w4 \ {
0 g2 M4 d m* H% T4 \9 H) |$ x std::generate(vec1.begin(), vec1.end(), []() {
/ A; T" T9 C6 @9 X- O return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
( q. B/ s- m" w1 T });+ X5 f3 M8 u7 Z4 _! ? r
( A6 T0 Y$ ^" Z$ l( R2 V& i8 {
std::generate(vec2.begin(), vec2.end(), []() {
# U* r! W4 B& B2 o8 M2 g' K8 }1 r return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
8 m, h! X/ }/ R5 U R4 \ });& o8 f0 T1 a2 s+ I: m
, p# W# t# k; C, V
for (size_t jj = 0; jj < vec1.size(); jj++)
k2 i2 ~# h- W' X4 ?- | {
/ d% J) P k% B$ g; E: f" n b1[jj] = vec1[jj];& z! @ d# V2 k B( d
}
3 O# _; x4 m4 g# G L0 [$ l5 n/ l% L2 \5 {& I6 E3 S
for (size_t jj = 0; jj < vec2.size(); jj++)+ G& ?) L5 } M3 o; \$ W+ @
{+ \$ s0 s" K l5 c) ^+ ?1 L' j, w
b2[jj] = vec2[jj];# }- r8 N; Z% U! {
}2 P' b# b6 ], U- \) {) A
* R$ O+ O5 w# y+ I* X2 r //Method - 1 N=100000 247s
/ _7 b$ I0 p) _5 q //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
# a# y0 M0 Y- M) i 1 b& M3 r5 W# D4 W
//Method - 2 N=100000 237s& L; F, k6 @5 g8 D* Y& Q0 D% R$ S
/*
& F# D$ Q4 E0 l+ S1 p& F for (int jj = 0; jj < N ; jj++)
4 o P1 n3 ^. v b3 \ { e! V& \, p$ v* R6 E4 i" n& |7 M
fresult += vec1[jj] * vec2[jj];
: ?% i2 H) {* Z! c }$ j' C& b* Q1 n, u, H
*/; |9 Q9 \( Z* G9 F0 N+ N
$ |( I* ]+ Y, Q% X2 M7 ` //Method - 3 N=100000 204s. i: C; `9 u$ [1 u
/*
' |* X; B* F$ \% ]0 i a for (int jj = 0; jj < N; jj++)6 Z; |0 X7 O$ l2 O! _9 h2 @1 G
{5 Q) {' W) M6 t
fresult += b1[jj] * b2[jj];
& T5 A) A& Z9 ]1 Q6 x }4 p$ K. c5 V2 m b$ G! d: z, x0 d
*/
" b$ ]5 a/ S5 {8 n+ [$ v9 s
5 ?# z9 }. W3 s/ a1 F$ U% U //Method - 4 202s9 m$ F/ n; K0 x1 c0 Q1 G4 A
/*, ]; k* O+ t& F
for (int jj = 0; jj < N; jj++)
* Z6 O6 W: @3 U- z- A* A8 O {) `/ B, R; `2 {! q
$ D3 w) u/ }* V1 x: a5 n }% ? X* k( w: s" X6 L0 O
*/
0 F% [ t; k/ J1 R* V //comment out all methods, N=100000 202s
5 ^, n- ?; ^. k$ P4 { }
. I+ X& n4 |9 ]1 N$ ~6 \' G6 p% k5 x
delete []b1;. t7 f) b' U" \8 ~
delete []b2; 6 R f, m" z, X+ V% Z3 t% u: P
|
|