TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
1 G z; M7 S7 E. q& B- ~# c: _% p* z; h1 O. o
理了理思路,重新做了一个测试。3 ?( h/ C7 q, w0 ?: B+ S# Z
做了两个 vector 和 两个 float *, 都长 100000/ h7 x& X8 s0 `2 d: V, ?
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 b, H. H. M q8 J
1 `( D1 u3 v; K! ^, [3 t
内循环试了4种方法,
7 q1 c8 V9 s% p. V! R1. 直接调用 vector inner_product 247s , t( M) [! H# F1 t' u
2. vector 循环点乘累加 237s6 p4 l6 R5 a' e# {
3. float * 循环点乘累加 204s" t P. `: A0 q0 Z3 i
4. 空循环 100000 次 202s0 O; {, `1 `1 T) F
: v' N1 {% i `" E3 i7 g不做内循环 200s2 z- U- Z' ]. G7 {
- b+ i9 c- q& ^1 ~: z+ n
你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 d( g, Y4 \" _+ X( S: c
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。. D$ T6 l3 D; R. C( w& \
) T+ I8 O! ^! ^$ E2 z9 |4 A
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
/ ?- \; L* E9 ~
" T& a# W1 z. p% I/ L% h(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)! E6 p |' O# E
4 t, g# a5 q5 p0 y
std::vector < float > vec1(N);
1 |4 d' c' Z* y std::vector < float > vec2(N);+ ?9 T) e& f5 `' u, E& \% w
float* b1 = new float[N];
0 r( t; H: b, L$ E float* b2 = new float[N];7 I- w. c+ r& o
# r% {3 \8 e; a, ]7 }
for (int j = 0; j < 6000; j++)
- n! _4 Q1 f2 v, m+ C9 ~9 [ {
. V: |" V3 ~$ K( p7 Z std::generate(vec1.begin(), vec1.end(), []() {/ c$ K( B8 c6 i
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ a7 \/ Y* e: T$ v
});
( N8 D% x. J6 i& V7 @& W+ P9 L$ p* o4 L5 U. E
std::generate(vec2.begin(), vec2.end(), []() {
. |& j; t8 ]/ Q5 J/ G9 J return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
r7 Q6 { D) w, G });
3 U: n5 k) h+ y* }$ H( V1 T
& S4 o/ J, B& N2 E% F for (size_t jj = 0; jj < vec1.size(); jj++): \3 i) S! q5 l. t1 K: T
{3 i* p2 n4 O; d) o9 Y; w- G5 v
b1[jj] = vec1[jj];
( a. [. B' N) g; F% n! J }# B/ r9 \( S3 n5 j
9 B e( w: {2 k0 Z0 G D2 _- L* \
for (size_t jj = 0; jj < vec2.size(); jj++)2 |; j2 u+ q8 v1 I% X
{! U6 C# F: r4 R' {* g/ G% }7 e
b2[jj] = vec2[jj];7 b) P" f7 Z9 o8 N) a- m! [0 o0 H
}) V. G& E1 B2 y4 V q+ g
# s/ W) a# n" }/ c7 _( H0 a9 J( v! F
//Method - 1 N=100000 247s
$ }- R, x* e0 T% y) ?( h1 o //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
6 Z* ]& b+ d& s) x \
3 i3 Y& ^# ^: K# q" t //Method - 2 N=100000 237s3 u5 ?8 e! z; m
/*" E% T: u; k8 c6 s) H
for (int jj = 0; jj < N ; jj++)
$ @5 f5 U) V5 T' I) I {% Z) ]% }5 X+ Y
fresult += vec1[jj] * vec2[jj];
) U( h3 t3 y4 c, M2 Y+ j) `# \ }% r- ~: A) b* E1 `
*/! S3 r/ o% J# `6 i
+ y) R2 X) {/ H% F //Method - 3 N=100000 204s% y- z4 U( v7 z; `
/*
- g2 a' q( B* N* J! V4 F8 ?4 u for (int jj = 0; jj < N; jj++)
5 w9 k0 k3 f& X; [ S {! U" z# [0 K; ~
fresult += b1[jj] * b2[jj];& E H: @$ y9 [1 c+ d: M q( i+ c4 p( x ]
}
6 s3 m; ]; j& g7 J; r5 e" G7 D6 W' K */
- I) x7 Y7 R8 b$ M* ~, p/ {. N
( [. {# w$ K7 x$ g //Method - 4 202s1 L# G/ C8 v/ C. b1 X0 `
/*& b- Z* K: i7 {! I/ W
for (int jj = 0; jj < N; jj++)
; K$ R. w/ V9 Y5 c7 W {8 d6 ~! ^0 F0 x
# \3 J; p$ S: J& v: a3 h! Q
}. r2 e3 m0 o/ R' p) U
*/1 P3 [' G$ b$ h& B$ k! \
//comment out all methods, N=100000 202s ( Q; U0 Y# A0 j- C
}
& ^+ t; G7 V. F* Q, x
5 r' _* X; w! H" Y, c2 b delete []b1;
% R. \/ i; ~3 W. A" b# M delete []b2;
$ [* Z& Z" _& D& ` |
|