TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 . ]8 A& n9 b* c8 B
/ `, M: U+ W# `" G! f& @8 p
理了理思路,重新做了一个测试。
( p, K, J# E! c0 r( D* ~做了两个 vector 和 两个 float *, 都长 1000004 i; @& d5 C1 m, _' t* E
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
3 X" E$ n- k; G6 L
2 V% x- x+ A% K内循环试了4种方法,7 Q: Q* ]9 b0 }- W
1. 直接调用 vector inner_product 247s
; K& j% n/ W; h y. i D2. vector 循环点乘累加 237s9 S$ M7 d7 F6 X, v
3. float * 循环点乘累加 204s
# D ~: M" ~, A+ Z; a4 k. j4. 空循环 100000 次 202s
) c6 A T! f/ O% X
) l: l& {; n+ g' W8 t; D* m不做内循环 200s
0 q# {/ g" k6 H! [6 |. y' M" a( t j
8 C& Q6 v& h) f- X你昨天说的对,内循环本身占比是很小的,大头在其他处理。
9 ^ {6 Y- Z! \( e8 |0 Q' P" `. x5 |另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。, N+ M2 B" b& x! Q+ t
: Z7 R1 p; [) R: x8 a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) X' ^& e* R# x. N8 D4 q+ K' V
7 i6 w1 J7 m+ d+ T9 \* q( m
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
! ~% R% b* I. q! I9 ]. T8 T4 W F1 E6 G& i! D9 E, \8 x
std::vector < float > vec1(N);6 r1 l3 C6 s% J# Q2 c
std::vector < float > vec2(N);3 P# }- M% \2 l) A5 | Y
float* b1 = new float[N];
) I1 {: i7 y( g" I float* b2 = new float[N];4 P d, W Y' K' K
. x( T v9 N( U$ c2 Y; y for (int j = 0; j < 6000; j++)2 e a1 v; s) \
{8 N% `9 d% L( {0 X! u- }
std::generate(vec1.begin(), vec1.end(), []() {
1 o' C6 z& m3 R6 r9 Z" ? return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ x: c7 o$ M, L# R. d! v. x/ c
});
% Z) b& i( V% l8 E. i7 W$ B9 H) P
std::generate(vec2.begin(), vec2.end(), []() {, {/ R# O/ R- \) c
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 }0 V# ? M. _3 N4 c
});0 m _' u) x3 c- O# q& y
5 _8 ]. h, D: h+ B" A4 x
for (size_t jj = 0; jj < vec1.size(); jj++) J6 R/ a$ j/ Z7 `7 X# {
{* ^( Q ^9 I& n ^
b1[jj] = vec1[jj];$ n; V* v5 H2 c' V+ H+ A( p) y5 X
}
! i' A$ [; q8 b- d, G9 f" A$ o
for (size_t jj = 0; jj < vec2.size(); jj++)
) v+ l/ S& A6 v3 e6 H4 j {
1 S2 |# C5 h7 w6 \ b2[jj] = vec2[jj];- x9 K7 Q7 k z7 t1 u. o
}
" X" r/ z+ u" ^) z
[) @+ a |$ u$ M- v, B //Method - 1 N=100000 247s
F! P7 x0 u9 L0 X! C //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
, ^+ t- a2 n: z9 T 7 l8 _8 N5 I/ `( ?
//Method - 2 N=100000 237s& {- F$ ?4 V8 Y- F. v) F! q3 @
/*
0 ?- V% s6 B+ {# m5 u! d' F8 t) d for (int jj = 0; jj < N ; jj++)
8 O I& Z% N" a% I) u! t {
9 {1 m: D* K$ H3 g( C8 c fresult += vec1[jj] * vec2[jj];
+ j2 D; H! d4 `' H7 W* A }% L. i& G T' S( K. [
*/6 r/ i# U+ n, f( u2 V: X3 R
# `5 J Y6 f& S. W) m% {, F
//Method - 3 N=100000 204s& A5 N1 l6 n- E( E; n4 f! V
/*
6 v. d4 v% D0 x. P1 @: { for (int jj = 0; jj < N; jj++)
5 `: K* J$ Y; x# T' Q7 R {. U4 P3 L, U0 |$ |& n
fresult += b1[jj] * b2[jj];; s+ [9 Z' }* }/ M' t9 q
}$ j+ l0 S9 g4 H+ x9 S
*/9 b8 V" O+ b' I8 O; o
. r1 ]4 Y. j- M" ?, D8 P2 p; {
//Method - 4 202s' S! t! p" M; g$ l4 D1 H) C
/*
i1 }# k3 ~- x, } for (int jj = 0; jj < N; jj++)
# d& n$ z& I& Q2 g+ X {* |, p" z# D2 j% o6 ~- @% f, L
! s! X. g8 Y& R
}
) ?) m6 |$ j5 T */
$ w, E, C3 e" d9 \# _ //comment out all methods, N=100000 202s
" @: _7 J r" }% P" a+ O' w3 U+ U }
l, ?0 z5 N& H( ~2 x$ ~
0 a4 }6 X. j2 U6 T- f# _) T/ j4 v delete []b1;1 b D2 ]- Y, J
delete []b2;
3 o' M) w% r6 l2 ? R |
|