TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ( a8 `* _0 g6 F
6 [. @! ~, j- D- l- ?9 W0 V
理了理思路,重新做了一个测试。
% s8 J) P+ ]! I! x* n$ m) p/ J做了两个 vector 和 两个 float *, 都长 100000# e% m4 b G% n( v+ m7 K
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.% q9 R l M4 F- I3 y, _2 V
& K$ B8 g+ g0 \内循环试了4种方法,
2 g: E5 h1 t# e1. 直接调用 vector inner_product 247s # P4 A, b0 P; A. k8 ^! c
2. vector 循环点乘累加 237s5 v0 n% e0 a7 }6 Z
3. float * 循环点乘累加 204s
. ^% p4 ^9 D. I& [4. 空循环 100000 次 202s1 f# C0 Z) N! V8 l
8 B# W8 {; C' U P e. P% G& T
不做内循环 200s
+ h+ E+ h& y& U/ g- N$ O$ g# }* K+ I
& N9 T2 t9 C! l5 ?2 ^ t" S' z. k! F你昨天说的对,内循环本身占比是很小的,大头在其他处理。
- }% T, H! L) S, A1 _( X另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。+ r+ N7 o n. i# F+ L" O+ M
3 L: F3 K7 v5 l! m
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
$ J9 t; f' u0 M5 a
% O. I; @! r8 V' n$ I* j(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
" X& d9 H E+ k, u) U% G: ?: Q$ J: J. C5 H: b: R
std::vector < float > vec1(N);6 D# q0 o! B' X+ ~, m. B1 \1 N" X
std::vector < float > vec2(N);( p! d+ G) ^7 F; h6 K
float* b1 = new float[N];
) p1 J. h( I% @) I$ P; ?: U float* b2 = new float[N];* A5 }, w% w: k9 `5 d
" j" M- {9 J2 }4 C for (int j = 0; j < 6000; j++)% c" U2 P! W; w* G' M# k# j! l
{
; `2 j9 i+ N. { X0 M$ u; ` std::generate(vec1.begin(), vec1.end(), []() {
/ p6 l6 v* i$ E$ p return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 c# h# I: L* n# X. T; } C# r
});
, I, d( H" h7 w1 e2 F
6 _4 H! A9 \$ O8 Q- Z std::generate(vec2.begin(), vec2.end(), []() {6 l& C* x, P& x: }- P4 n
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;3 O- d3 |" ^, T5 h" n( y6 b! D
});8 o& h# ]6 O. p4 u9 P- P- D
/ u- ~: }& s8 |6 {) i
for (size_t jj = 0; jj < vec1.size(); jj++)! P# I/ Z! y' w/ I
{
; h/ G: k2 G/ F5 O+ |3 @' t- K M b1[jj] = vec1[jj];
1 b0 P4 g1 q) \- g% Y% z0 N }2 B: _. i- m9 K' V3 O
# {6 X) T8 m/ o" W9 A for (size_t jj = 0; jj < vec2.size(); jj++); z8 Q! y4 A/ j: Y$ ^
{
" W) E$ C0 O5 ]) ?- L b2[jj] = vec2[jj];
. s, K" Z% X2 ^0 Q+ A }
6 _. j% ~ v2 k! W' s( J* C. h' r0 Y
//Method - 1 N=100000 247s
. T) k: D) C' _8 r5 c1 C //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
% N, u; e) Q1 q5 R0 z
" Q& U H. ?' i //Method - 2 N=100000 237s: ]3 M: o6 i( a# K/ A+ y. \- w
/*
) r% o. O$ X) S6 k% g for (int jj = 0; jj < N ; jj++)
# [1 ]% |0 t' e {
5 I+ K1 S5 J! L6 p0 _3 \ fresult += vec1[jj] * vec2[jj];
7 ~/ c9 M8 {' l. U( C0 e" \! V }: O6 M% w) T& B+ I, [& ]
*/. D$ K y7 i" ^& M* {8 ]- v1 S
9 s( P8 H4 D7 x //Method - 3 N=100000 204s6 u- c- R; s# E, g
/*1 M% ?! j8 n, [- @3 c% h5 X
for (int jj = 0; jj < N; jj++)
5 Q4 w0 Y$ ^6 S) [; ], X o$ T {3 J* x9 p4 a* i/ a8 E. G9 Y# n
fresult += b1[jj] * b2[jj];
0 B# U" w7 b3 K8 o8 a) Z+ x0 C4 z } }
8 B# G. ~4 Y0 r" X' p0 k& D% @& K) T */6 G; ]0 t& `/ v- }* `
z8 G$ g# O5 Q
//Method - 4 202s
9 X( W; X1 D$ ~4 V4 V+ W' r /*
# V/ n& I: Q; g/ N+ R$ y/ d3 o for (int jj = 0; jj < N; jj++)) l# ]) U- H: v" q
{
: Z" i; u7 v* Y
) I# S' f G+ h$ T/ ?( T2 \ }
8 m$ `2 N4 P2 _ f8 H */" I" [6 o3 l- B% u( t3 y
//comment out all methods, N=100000 202s
' F. C j. n, [& x' U }
7 T$ p9 i6 w5 s/ t. x
4 {/ j! N% R+ a delete []b1;
, H( `8 E$ J" g; ]1 }+ X1 D/ P3 | delete []b2; # q7 N' ^- ~( J% d9 M3 ?& m
|
|