TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 6 O1 `* ?1 S, G! q
) Q2 q4 Z: C; M- b: n* R# t
理了理思路,重新做了一个测试。2 |# N8 ^0 Q: J
做了两个 vector 和 两个 float *, 都长 1000009 _4 E# Z) ?* ^
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
4 e( r V2 K% d+ @9 D8 P" X5 O) K
! y' ~5 B* i6 u) j0 b0 i内循环试了4种方法,
" X* g) {0 |5 Q1. 直接调用 vector inner_product 247s
8 v' |- k7 H0 k9 X; z2. vector 循环点乘累加 237s, L) ~, e# G) v" I
3. float * 循环点乘累加 204s% q" n4 _. l1 Z$ j" h
4. 空循环 100000 次 202s! Y+ c" W, {% E+ T
" ?$ H0 `5 i- y/ ^# o不做内循环 200s$ E. Y' `; w1 E- z. q) a/ ~. B; E
7 C/ B& T7 [7 f1 ^+ b
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
' P- x% e& D( @) V( y另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ c+ d$ G. z# e
, C9 [4 j( U" }8 J' e; l# O9 q* T% W
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* i. [4 n3 Q: P; X
( U# v9 L; K0 m( E4 [ u(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
$ G( {) o' a/ |; N8 ^- h
9 Q1 [2 p g8 B6 Q6 f std::vector < float > vec1(N);
, _0 @) X2 h ^1 G std::vector < float > vec2(N);% Y- c5 t' i' U; r2 @
float* b1 = new float[N];, w0 C- U$ E4 h7 i' w. r8 w
float* b2 = new float[N];
2 O/ ~- V/ B, s9 b/ |- J- m
( @0 e h7 ~. z t+ M. K# c8 } for (int j = 0; j < 6000; j++)
% l% [7 w7 q' K2 y! L* x7 m8 g {- k. p+ D/ `7 P6 ^5 Q: k* |7 O' W
std::generate(vec1.begin(), vec1.end(), []() {
) Z! ^; j* C% j0 h j: M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 V; a/ U8 ^! ~; ~( ? });7 x$ |7 w% C& e( \, \( ~/ [. J
! ~& y( b o. h
std::generate(vec2.begin(), vec2.end(), []() {+ S: v6 [* D7 I D: A- Y) [
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
2 V, o, v! }* y });
- X* ?. V* E. S, g0 g- h3 z. @1 O8 B/ f% V. e( Y q0 f! G/ E/ y
for (size_t jj = 0; jj < vec1.size(); jj++)9 q; `8 K& Y! ?$ G" R6 g) ]0 }' A
{) H3 n# e$ A' { v9 m8 s7 \
b1[jj] = vec1[jj];, ?5 W- l o0 W+ X% h2 w- @
}$ d6 ]: m3 N7 P5 ]$ G- m
; L* y- m2 U4 }6 C- e
for (size_t jj = 0; jj < vec2.size(); jj++)
" f. ]$ q; s- p" z- Q, i g- V1 O+ { {( |* i6 y9 ~5 a
b2[jj] = vec2[jj];
) r! D. l( z6 T2 J$ Q3 e' |/ U7 a }
( f& _* A2 ]& N: z1 [* e9 e: K- l
% j8 E1 f/ b z, b. [: f //Method - 1 N=100000 247s & |" |" u9 R0 _4 C i ^
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ E$ T& ?) o& ?' a' R3 R 1 p+ D4 Y; b) E+ E: F
//Method - 2 N=100000 237s
- c, a1 W, G. i. R /*5 T) q8 m% \9 l# _+ l0 A
for (int jj = 0; jj < N ; jj++)
3 Q: d1 J" e. f: V4 `5 Z0 P' _ {! k- D+ J( ~% x s' V
fresult += vec1[jj] * vec2[jj];
9 V- u5 ]. a2 x5 x$ Q2 g5 c8 E }$ B! `- u+ c* U! |8 s
*/9 s/ D7 e) B9 I' ^ E4 @ U' |
0 z; E0 x) O. U& n% W E4 F, f v
//Method - 3 N=100000 204s& S3 e c' p [, d+ [
/*
% \. s" y4 d2 p, y+ p {7 T for (int jj = 0; jj < N; jj++)( p0 l/ @0 _9 W6 k
{
8 @: K1 d, w9 T# K' {! q fresult += b1[jj] * b2[jj];0 G# {& u9 d! m0 G4 H- [
}0 q, [! f9 K& s5 q) J8 K5 _
*/
( P7 `" P$ ^4 u8 g$ l2 d, L u$ N& \2 x# b% Z
//Method - 4 202s' r9 L. c# X8 N1 N+ {. @5 B
/*
9 t) L4 d3 _% M2 P for (int jj = 0; jj < N; jj++)
" T; b1 F% L, ^' {) b5 P {, k7 N) \7 [0 B
: r$ w0 F6 ]) u p; p }
x. j5 m4 Q- w. q7 y' l */
6 B7 V( c- t5 s1 B4 i6 O //comment out all methods, N=100000 202s / E! I# C/ h; Z5 t' a
}
" w% Y2 e, x; s. H, m. l$ z+ E7 C) ?% A4 j Q( W# |, o
delete []b1;+ K: a! z7 w( J9 [% J4 S6 T4 Q
delete []b2;
2 C/ a7 I' C1 e/ D. _. | |
|