TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 : J5 \3 J, u: m7 K
. `6 x; Z+ `8 _, @: {理了理思路,重新做了一个测试。1 C. D" k; t6 e0 k y% `% L
做了两个 vector 和 两个 float *, 都长 100000
# n+ U8 S* H" o% x+ ?外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
& u4 A& x; I/ |; s3 D8 c' Y" G
) }- \: g% d' y内循环试了4种方法,8 C. I) m$ M) ~7 Y! S3 U- k3 {
1. 直接调用 vector inner_product 247s
: m) J9 ?/ F; n0 G& e2. vector 循环点乘累加 237s; r, X9 r! H1 \. b$ Z9 F7 U
3. float * 循环点乘累加 204s7 [2 Q' N' X9 x3 |) C* Z4 x
4. 空循环 100000 次 202s, ~% E3 E; F; Y/ t; n1 k
3 u9 W e3 m" T- p4 u; f f/ ~
不做内循环 200s
" R) Z' E# {1 x7 ^& F, A' V1 s7 Q* S% r; w* U
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
- K! K2 G( G4 K# G* ^. C3 q( W. I另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 f0 R5 r0 _/ c1 l" @- _3 I
6 d5 u9 R+ v& p& \
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
$ c8 ?/ O# ^" D6 u' k
[1 d ], w; |5 @3 T% _2 @(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)0 B3 s& ? L. U2 v4 B
+ k7 _2 T6 P: W% S# A- }7 s+ i) Q. a std::vector < float > vec1(N);4 }& `& N7 R$ i2 o8 W- D$ J
std::vector < float > vec2(N);
) J/ |( X$ M6 e/ v# [ float* b1 = new float[N];9 B! E. k+ [3 g1 a/ }$ ^" F- X
float* b2 = new float[N];: V. H2 i* }/ }
/ f; o8 v. p" b1 ^
for (int j = 0; j < 6000; j++)
( c+ s9 F) e6 x( u9 Q! f4 _ {
( X) G; a$ M3 Y! M9 c. k std::generate(vec1.begin(), vec1.end(), []() {
$ I, H1 T' T+ e. b7 F! m) d( l return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
: P( @/ X: V" y5 l9 [5 |7 U });
2 H3 `+ t4 S; H
g' T) _2 E/ b0 ^7 k, t; h* B5 \ std::generate(vec2.begin(), vec2.end(), []() {, J4 z" n' Z* c9 V: n0 G; [8 W3 m
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
0 U! ~! W& Z# `: X });$ v( y" z; Z$ w4 A6 G0 ~6 s
# v' v1 U2 H/ W* O" b0 P
for (size_t jj = 0; jj < vec1.size(); jj++)0 _3 Z3 Q- {3 b6 Z* o
{
3 B. o/ t8 c& ?( z E3 K b1[jj] = vec1[jj];( X& g6 t" y# B4 i, g
}
G8 e8 N" T" @4 }9 @7 f4 p* C$ A7 Z5 M
for (size_t jj = 0; jj < vec2.size(); jj++)8 a6 m% V( |% s# n% y0 a H
{
! i7 `) l: [: U9 }* C( s- l7 R6 f b2[jj] = vec2[jj];" r! M$ Q/ e, {/ a: q
}7 M! C; V1 r1 `3 s4 _9 f; `
' c7 v5 E: M) R
//Method - 1 N=100000 247s " U; f# D- Z% V9 T, L+ y$ N) E7 J
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. i! E4 m& o- P N7 Z' F
& u" G1 ?$ v$ p //Method - 2 N=100000 237s: }! T/ ]% d4 Q' S
/*
* R' e) Y, Z* C: y+ u; ` for (int jj = 0; jj < N ; jj++)4 \* C- @! X# q8 L
{
. H% w$ A$ M! n$ b' Z& Z fresult += vec1[jj] * vec2[jj];$ U& i3 N! P% K
}
+ ?6 w1 f) H' m */
/ s, l, e: R3 \" ?8 A - `7 {# O& t3 \+ ]/ l1 T
//Method - 3 N=100000 204s
0 m3 p; e- b2 Z* d8 z /*
2 Y1 b+ x9 n* C( R2 B4 i6 ] for (int jj = 0; jj < N; jj++)" B" O3 i* a! l% J# X5 u
{( l# c2 t1 Q% P' H p
fresult += b1[jj] * b2[jj]; d# t* }4 P9 q
}
6 U" ~0 y; d* a7 R" p0 T */
1 n; N* _& K6 m
7 T3 N& P, I0 ~: c& I6 Y7 C //Method - 4 202s
# b' S6 h7 L: V* B /*
) u5 P4 P9 Y$ M7 A" c M P! I3 g for (int jj = 0; jj < N; jj++)
' `& c1 P( N p+ f- e {
/ d- S6 q% I! d 6 J* H% t# L1 z y0 r8 Z3 y9 g+ w
}
2 X3 X4 H7 {) H& X */4 ~2 U& q" t: O
//comment out all methods, N=100000 202s
. C6 E$ L! o& I: D" p- w }) [- s6 M4 c# d2 n& h
% W8 D5 W4 M* P0 p+ f q2 \3 c delete []b1;
' o& h3 T# w* @- ?, i delete []b2;
7 z1 ~" `: ^# ], R |
|