TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 * Z) g# D* D2 a1 e1 q8 @8 D' v- j
) Z1 {- s; D: k1 @' T
理了理思路,重新做了一个测试。
# u$ b6 Q L- Z8 G+ V6 ~做了两个 vector 和 两个 float *, 都长 100000$ }) @+ k& \. P4 i& L" D7 b9 j) b
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
* E% w$ a; a; Z2 d- |5 Z8 t1 F& a" y. W% ^
内循环试了4种方法,
6 y, s7 F0 R6 w( J8 _7 W% w+ i1. 直接调用 vector inner_product 247s
0 t+ g! c/ W9 |% d1 o2. vector 循环点乘累加 237s: {0 _0 G2 h) Q& l
3. float * 循环点乘累加 204s
! j. b4 _) j/ V. `4. 空循环 100000 次 202s0 V: q5 O3 `. P0 ^ x
. O- i' k/ I0 f9 B1 b不做内循环 200s
5 r1 X( L1 q) F1 f: A, S) u2 F1 g7 P3 r' A: a9 W0 m
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
|" z. O# N( e另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
1 U2 Z- c* @3 m) { ?" F C! g/ i( w. v5 k! b( R, s5 M4 j
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) k7 F& ~9 V2 N# N! p
7 ]; t4 N" {7 |/ K+ c* F( \- J2 ~(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
# P; V/ [' ~" X9 y+ w& Z, E
1 v$ g3 G- x9 U$ a- R8 w std::vector < float > vec1(N);
, ]3 e, u% U& W6 C- h std::vector < float > vec2(N);
; e% X0 i# `4 Z float* b1 = new float[N];: F4 E& W& W4 ?* @* C# z$ R
float* b2 = new float[N];
% K! y1 m! o; r4 Q2 W( g0 T( r9 S; b: R& n4 V4 z; b
for (int j = 0; j < 6000; j++)9 R# J6 O& K' ]
{
9 @, q4 m" z" B3 y. F std::generate(vec1.begin(), vec1.end(), []() {
5 {# G. Y( B* O. c. y0 s. ^7 C return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
8 ]6 {: l7 _0 f6 H0 e) g$ w8 M });
' d- \( @. \$ [$ r2 s+ M
+ e+ v n7 n( S5 [# C std::generate(vec2.begin(), vec2.end(), []() {
, L; O* U" B; c" D; i return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
& z( H! g6 x* F- A Z });
5 Q0 o% J" U! H6 D1 [7 o3 S1 F
2 }/ H9 \3 _) B$ @# A& s. w for (size_t jj = 0; jj < vec1.size(); jj++)
5 A( m7 J, ]7 }! N1 @( \! T- s {
0 e$ C: R( A1 T! ~! h" I1 v b1[jj] = vec1[jj];* L/ U$ \9 Z; h, S$ L
}9 [* ^$ M/ d+ J# P6 A+ A; e
; N/ P# M, S+ J6 ` for (size_t jj = 0; jj < vec2.size(); jj++)
4 B3 _( @# j% e' G- z5 w9 K) Z6 n {' U. i& ~5 W7 t/ d- t+ b
b2[jj] = vec2[jj];
0 b0 b: M, N3 _2 L) R( q) I# x }. Q$ O' u z. n- t x, |
" E _7 M2 ^3 e6 f //Method - 1 N=100000 247s
# N, C1 w/ R2 F, Y8 O. E( K6 T //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);" `5 b+ t3 ]; y6 }5 B) \3 u9 [
( n* p4 W7 R/ A" \! Y9 h //Method - 2 N=100000 237s- s3 R5 n% e$ x( `1 D P
/*' S3 C6 G/ Y- L: B+ X
for (int jj = 0; jj < N ; jj++)
2 x" R$ E+ L4 n5 v2 C6 v3 I' Y {4 ~+ `+ ^# I2 ~
fresult += vec1[jj] * vec2[jj];; Y- T& P/ T0 R. r
}& H4 s2 w) P2 }# l7 f, }
*/
" G9 h q; s7 Y5 h" t$ Z
4 e/ J- g" s5 o$ k/ e: z7 u1 J //Method - 3 N=100000 204s
$ C" b8 g0 Q8 [, c$ c6 x& { /*: F/ J: D% P& @
for (int jj = 0; jj < N; jj++)
% G& C+ } Y3 _: I; Z+ t2 w3 d {" K3 D6 v; `3 k- i5 \- V
fresult += b1[jj] * b2[jj];; g* u: {' \3 m* H
}
6 k5 o0 U' u4 t */
* ?1 P" ?0 E0 P+ y, Q$ g0 ^6 K
3 C! R8 ]: D i0 B+ ?/ S$ i //Method - 4 202s# ]4 _' a, ^- x g, T+ ~2 s
/*& U9 U$ p; T. C
for (int jj = 0; jj < N; jj++)0 ]8 Q. {5 u% I/ o7 D8 k
{8 I' P/ |* c* T6 ?! b
3 J2 H; w. g5 \: z( f4 M( |8 O
}
( `( k, _2 d! @ */5 Q3 N4 t$ r' O4 i3 @" I
//comment out all methods, N=100000 202s
6 k% x8 Y0 o& {6 T& o8 b }
% I1 g# N5 K2 S+ t" O2 F. Z. W% ~9 S/ `0 a. @
delete []b1;3 W X7 C! {7 N, [) G
delete []b2;
( p4 C$ K0 @, d7 r- k) f" W |
|