TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
4 K! w# o8 D% q# [0 n# n% P
$ D2 X0 t; v& s# O+ Y理了理思路,重新做了一个测试。( w8 X; _5 j! i. A
做了两个 vector 和 两个 float *, 都长 1000006 B+ q8 H W/ \# y5 M; @7 I
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.4 ^' u) P' V! Q9 C4 O. }" o5 ^
& R: X' r' ~+ l4 j% t
内循环试了4种方法,( D; W: o) z- r1 C9 L6 l
1. 直接调用 vector inner_product 247s
1 ^* [7 n' M! z- M. c& k6 A2. vector 循环点乘累加 237s
" z v+ q4 @% L, i0 u* y0 U8 p5 R3. float * 循环点乘累加 204s5 x' b8 ?0 K+ X+ ^, h$ Y) b+ h) q
4. 空循环 100000 次 202s
( V( d" }! Z& f w) @$ \/ j) ]. H+ t7 J8 Y9 m+ V* y1 i+ c
不做内循环 200s% O0 F- r& e" y' x( k7 R: o
0 S7 w8 x v5 I
你昨天说的对,内循环本身占比是很小的,大头在其他处理。/ N# T- n+ G) d7 n m5 }
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。4 P) H3 ]- x& j a' F0 h
1 b4 e4 X' k9 @: p y p& J至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)4 k8 j$ c5 _8 ~
) Z8 R- q) F$ H1 }4 N/ d* S
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)6 T7 b8 S4 L% t" y4 V$ @6 V
$ J0 Z- G( l" q+ @$ @- W
std::vector < float > vec1(N); K1 w4 y1 |- [( T! t; b3 `5 [: W" G
std::vector < float > vec2(N);/ m1 p- Y; z8 z/ s
float* b1 = new float[N];% c& m8 Q( S% y
float* b2 = new float[N];0 y7 W; M. }6 Q/ `1 T5 S
) h0 X3 c- s6 {7 D
for (int j = 0; j < 6000; j++)
/ e0 S: P; z( j/ X; u% a {
: Z% N! e/ W. d9 v std::generate(vec1.begin(), vec1.end(), []() {; p: [3 o9 C8 @
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
9 V+ n6 s: B0 W: N1 y4 g, X });; g* r. }7 f5 S, a, s1 I
1 \! _- a, b/ v0 |: S& R z# o, F8 N std::generate(vec2.begin(), vec2.end(), []() {" z; Q# k6 v* o* `
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 R. V2 o% E& y, o });* n; B4 b$ f) P/ _( H( d
" w; Y- x; g5 i0 C# B# k- P/ P
for (size_t jj = 0; jj < vec1.size(); jj++)+ ~8 g% l0 t f# W' W
{7 X. O9 @& y- _: _
b1[jj] = vec1[jj];: ?6 I$ f1 w& Q! q! c! g
}6 ]& r/ ]6 Z+ D$ Z& y5 b
! d! ?, Q1 {- X* A- G for (size_t jj = 0; jj < vec2.size(); jj++)
7 j3 F6 h: \0 m! V {
, X# ^! b" V* {! n: k# e! H9 e b2[jj] = vec2[jj];
7 k6 A7 g+ D# I' ~- I }
5 K. Q$ J- O" X% _0 I, F& x" n0 Y9 L7 k, ?+ \4 O
//Method - 1 N=100000 247s
8 H! r" V h( c4 d //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
: U/ t6 x; ^- r( P h" {0 _ : s) _/ x( c/ f
//Method - 2 N=100000 237s1 Q2 r( c( U1 ?( x+ {# O
/*
* V" w! G# Y* I7 s( z' F for (int jj = 0; jj < N ; jj++), p- c: `4 s7 f" T1 c
{
/ c9 I( N7 U1 [" F. x+ L- E8 [. z- i fresult += vec1[jj] * vec2[jj];
6 {' p. {: T1 P" Q& G- [4 } }
" S6 w; r9 K' @- g$ F */
2 T8 r7 b+ ?' h
2 f9 w9 D. z7 L/ w/ k) r //Method - 3 N=100000 204s
- @2 G$ z( G, v. z! K3 Y8 p9 ]3 y /*, _4 _% s2 _; q5 z4 d
for (int jj = 0; jj < N; jj++)
6 X7 E% V8 N0 e" g" g2 l { z+ `) q+ @0 F- M: g
fresult += b1[jj] * b2[jj];8 \- f* S8 b9 s6 \) z3 g
}
& w- r- w5 r% @; I- z s/ u */
) f* L$ C- r; m4 C1 o6 X6 o/ b0 O1 o
# ~0 @$ U' \# r+ [ //Method - 4 202s/ G( K0 F5 k" h* q$ z( [
/** @ Z; V' u! b; p) d7 B1 l( l
for (int jj = 0; jj < N; jj++): \ ~1 g3 k8 b1 z
{8 z, b8 Z6 m- \! U+ Z. ?+ Q) q' e. }
: F% ^, D% t1 @0 X9 t. Y* A/ H2 H
}
/ K" Q O5 B; c* J$ r( I */
% |" F# z l# g4 E1 E8 R //comment out all methods, N=100000 202s 0 G9 \' [# v: o# c- a: D8 g/ I
}
; T& b0 H; q' d$ r5 J% D$ S3 K. l+ W
( Y1 G8 |! ~+ J8 S6 I3 N! | delete []b1;/ W7 R6 ~+ I: ~ H/ C
delete []b2;
0 s. v9 c0 k/ d |
|