TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
" a0 w. G, i8 f' s4 }4 h$ u# }3 Y/ C" D6 Z! M. d
理了理思路,重新做了一个测试。
- H2 A. y o4 G6 w3 U4 B- _做了两个 vector 和 两个 float *, 都长 100000( U# W* ^9 `! w
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
. h* J+ [( z O+ _% S) [3 l0 H1 H0 d% I' N9 N) R
内循环试了4种方法,
& r6 e+ T$ H' G8 l& S/ {1. 直接调用 vector inner_product 247s ( Q( n: z; _; D2 l4 b
2. vector 循环点乘累加 237s3 L0 a8 Z0 k) _
3. float * 循环点乘累加 204s; ]- E8 Q* H. Z0 P W6 K4 }( k
4. 空循环 100000 次 202s
; ]; U7 ]9 c% k3 a7 _5 x% @+ z& t; a) h1 {6 p
不做内循环 200s
8 v% e, { S8 \* X" r9 y& z
; R w9 W4 h C( B3 B4 M5 y# x你昨天说的对,内循环本身占比是很小的,大头在其他处理。
+ E" M/ J6 F* W2 e- X8 m另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 I' t( T) b! T; z
5 n2 }3 h0 g9 U2 Z' D
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ Y* M( p. d* O
3 {2 T/ Z9 N- P/ @) x(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 |8 Y4 \% J$ t p k% j* D! l( Q% M m" B5 {6 [! W
std::vector < float > vec1(N);# Q& a8 m4 l7 B5 h! g1 f
std::vector < float > vec2(N);, @( W% d! `; T7 c7 l- p V
float* b1 = new float[N];# J+ ^" t) @+ w9 N7 V, q
float* b2 = new float[N];
Z9 _; ~1 o! K7 }, C
+ M3 {" O" {& G for (int j = 0; j < 6000; j++)# H' F. F( s9 O
{
% k$ P5 C: `' B std::generate(vec1.begin(), vec1.end(), []() {
0 u& v& G+ \# m2 s return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 \0 q g0 m& c9 D( n& T e; y7 y });9 V0 B" R+ y# Y. A
8 j) g# a" ~# P2 `! W
std::generate(vec2.begin(), vec2.end(), []() {' K8 Y3 ^4 ^& w, a0 I; N y2 b4 s# d8 ^
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
0 [6 j, G; K7 o& r5 m K });& a9 h; b5 y4 X$ e
- g. p- E# }) |9 W# _
for (size_t jj = 0; jj < vec1.size(); jj++)$ ^7 S% t1 Q B3 W( ~0 k/ L `1 x
{$ D" b/ [7 B8 N6 {1 ^) j
b1[jj] = vec1[jj];9 f# r/ H7 S5 y. s9 ~) x; ]3 v4 U, m
}& K, u4 A; c8 G
, y( O3 D* J2 v# g: {# X v5 Q$ _ for (size_t jj = 0; jj < vec2.size(); jj++)* e A! v/ i1 v& w8 ?3 p, }
{0 m M5 ?, E+ F5 H: Z) g
b2[jj] = vec2[jj];2 ^8 W0 @/ }) G
}
8 @) d2 }+ y- X4 n/ t$ \1 L5 `9 i* `. A
//Method - 1 N=100000 247s 1 U7 i+ {! w9 k% x
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
; G# Y+ j) y+ @/ l5 b0 o8 B $ H) Z( M8 L9 r* @5 G4 _
//Method - 2 N=100000 237s. ] H+ a. S% D2 k; u
/*$ b1 ~" Y' r' F" W1 u
for (int jj = 0; jj < N ; jj++)
; ~6 g$ X; f( E% p0 `6 | {
2 F( e( c ~; m4 h fresult += vec1[jj] * vec2[jj];- F3 A7 P6 K2 j% G7 e' K$ d
}, e: o; [9 q3 B8 m# N: ~
*/3 A( C1 g/ j) m7 ~
6 j8 Q! ?& _7 U* ~: d //Method - 3 N=100000 204s
+ s$ A" Q7 d8 m2 b9 S /*
- x! ^% A& m, C0 J, S7 y for (int jj = 0; jj < N; jj++)
: L: h& v6 W, B, b% {+ Z {
# t) h* S. @/ ]. y# }) e2 A fresult += b1[jj] * b2[jj];
' o: r( B8 Y6 s' y4 R* j }1 Q! S+ w$ k P& k& Y" u% b. a" Q
*/! D% n5 M" r; J, N1 O+ Y) h
% b; s2 o$ U, b! I( a
//Method - 4 202s
* Z+ I8 [& N f2 F /*! B1 I9 T# {7 Z6 b' V, Z$ H& B
for (int jj = 0; jj < N; jj++)6 I2 l6 Z0 b6 c' \/ M! p3 O
{7 ~) q C/ N" z1 O) y E) ^& t$ T
7 M: p- C* U8 ^1 Z0 I: Q; q- M: P
}% W& y/ u2 i6 ]! r$ r: e% m+ m" V1 Z
*/0 U/ X1 }& _* Q( D* P. v- h
//comment out all methods, N=100000 202s
' l" g4 z- b9 H2 K, [ }" d) B" N1 }8 e2 S; f4 I+ ~" A
/ r! E5 k d, Z" W delete []b1;
0 M+ e9 ? E4 Z$ C delete []b2; ; B3 g) {" R4 i2 c3 N$ D* b
|
|