TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
$ x4 e% K" E; t6 {2 F% V3 Q( j. J X7 X4 T& Z
理了理思路,重新做了一个测试。
% W# d' x& V+ Y7 N" @做了两个 vector 和 两个 float *, 都长 100000- v6 A g* u4 T# @7 }5 G8 V
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache./ K6 }! p g: u0 c E& o& ?0 m
9 c3 N+ V3 r$ r# \& e; D4 F
内循环试了4种方法,8 e. Z; B/ V- x9 w! Q
1. 直接调用 vector inner_product 247s , |5 m) X# E: Q
2. vector 循环点乘累加 237s
& L) p6 ^) z, s3. float * 循环点乘累加 204s
9 K8 N4 k$ P& [+ }: n4. 空循环 100000 次 202s
1 O. [3 i( \1 f) N" k0 j: w( @2 {- n# P
不做内循环 200s
) J+ U7 t$ v: T$ g- X* R; k( \' X* d% y4 D1 O3 y
你昨天说的对,内循环本身占比是很小的,大头在其他处理。' X/ D m5 v# f1 L7 k: S
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
. h) J* @( U% m: m% ^3 g8 f8 u4 r( i( x! i+ d; n6 t
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试): S) M4 a4 K/ K( W2 ?1 L. I% Z
5 W1 {( X) j3 x2 [" ](为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
0 l: \- t2 h3 }/ p5 T1 g9 {# N- `/ @$ m# `
std::vector < float > vec1(N);
0 N7 q0 Q# S3 Z8 n5 O3 ~# G std::vector < float > vec2(N);: e# z) ?7 A# ]( g/ I2 N
float* b1 = new float[N];' p/ x$ a) T5 w f
float* b2 = new float[N];! W, r" J! |, R: L
$ Q. t2 {2 H* I7 v for (int j = 0; j < 6000; j++)7 L: \" p9 q: `8 c- z6 i2 H7 f' m
{7 z2 @3 `) M% U
std::generate(vec1.begin(), vec1.end(), []() {+ C$ K! a8 ?) {# n1 ?7 {. A
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
- ]* b7 N. X- }9 t });3 o; o/ z* ^ }% F X& q! U
& G$ C+ n+ J% e* v: d$ C# X
std::generate(vec2.begin(), vec2.end(), []() {$ u- x! C% ?8 I, ]
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
, @6 l: ]% N* g$ ]' O9 d/ y });& ^9 e) H. a1 {3 ^7 o
8 G' y; p2 M# |' ~) t& m2 Q
for (size_t jj = 0; jj < vec1.size(); jj++)
2 X% w# {& |: g {2 s1 `% h7 s+ x) @* a' A
b1[jj] = vec1[jj];
. p. P' u. c2 U4 d$ c- V) x. f2 { }
2 c& ]2 G, t2 q. t7 Y1 D4 z6 |# J7 U6 O- v9 `/ V. z
for (size_t jj = 0; jj < vec2.size(); jj++)3 q" E: d/ y" u& D# S
{, Q4 Q; l# A. e. g% M, A( S2 p1 a* n
b2[jj] = vec2[jj];
3 W, a+ v3 Q# P% U }+ j4 p& A- h f U- }
" X9 k' ?/ L$ I; y L
//Method - 1 N=100000 247s & d: t( I1 l$ V5 r
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ p, _- Y* k$ V" ] ! ^ y+ H! o: V% L
//Method - 2 N=100000 237s
1 O# r" P; U& b$ [. B9 j /*
" ?3 q' \2 }5 e% J3 |; J V for (int jj = 0; jj < N ; jj++)
- [& v2 w5 W% W" e; S' }' Z+ O {( x( e, t. P# { E/ ~: e
fresult += vec1[jj] * vec2[jj];
F2 M+ Z0 b0 }; w, `9 ~5 D6 P }3 K* n! l$ K& V8 ^
*/
: \! S- K p) y: w1 T" b
4 d' @5 J |% i% `& y //Method - 3 N=100000 204s
; @3 o1 l5 ^6 Q, I. ~9 W /*
4 U7 Y# q1 D: Z; Y, c for (int jj = 0; jj < N; jj++)
& |: Y% }' D7 }6 V3 `" h3 H/ P9 e {
}" C; \, M! M& O* e4 O fresult += b1[jj] * b2[jj];
$ i5 }1 e( W1 h/ K3 `: b/ }1 l! { }5 G' g2 ]0 ~+ ~. @
*/
& a/ X( I, I( ?1 K8 _/ M1 ~6 v; d. ]8 O1 ?2 q
//Method - 4 202s
8 P4 g- s3 m7 _/ N* M /*
. R& f$ b w! e' R& s7 x- D for (int jj = 0; jj < N; jj++)- Q, I4 \" H! [+ f8 f
{
9 u- L# p2 {! p9 I % H: S7 R% E; J! ~ r5 @* r8 ]
}" W. f* E: j" s; E! Z
*/, @6 K4 x$ x# Y- H9 X. Q
//comment out all methods, N=100000 202s 4 h& u( }. F3 I4 [+ I4 O! b5 G
}
- v; I$ w2 U8 Z1 l$ Y, `( `
+ [; C1 X9 z. u B' } delete []b1;& I- i3 Q3 S5 l6 o& M8 k d
delete []b2; ) Z) ?, d; H- x7 [, P# {
|
|