TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ) V/ U1 y* V, I, M" H/ {# `% ?$ C
c' V7 ~4 w- T" q7 h& O$ M: q. J理了理思路,重新做了一个测试。
! k4 J) O+ Z2 l( }. ]; I& D做了两个 vector 和 两个 float *, 都长 100000
# L, e& s$ ]1 ]; H/ F: ]外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 I, V: Y5 S5 [
~1 E! k {9 S内循环试了4种方法,
' s" S7 X* ?% {$ U2 z9 O3 q1. 直接调用 vector inner_product 247s
$ X. Q) [' b R# g% f7 d+ {& N7 R/ G2. vector 循环点乘累加 237s
5 O; z' G( j r: C+ m3. float * 循环点乘累加 204s
[1 o t8 [% x+ }4. 空循环 100000 次 202s
$ g" |" { `4 f7 j; i. L
" I9 ^5 G& e7 B5 @1 N7 r# \不做内循环 200s
! S; c1 d i1 q& B8 \9 ]3 T) J8 C0 G' b9 U$ g( N3 q' Y7 z
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
5 j P! q9 |1 Z8 y; B# q另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
! K* m0 f1 l" X. q& o1 g5 v" K/ j$ b, y
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
* w& M3 \& Y+ F1 r; T* s5 F" V+ Z+ b3 F' n: y. z# g6 [0 }
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
; U/ }$ K8 M9 d- G( S
/ X+ }9 W4 h% m2 z9 @2 Y' i std::vector < float > vec1(N);# h" C) N: F9 A5 ?; O/ { D$ n
std::vector < float > vec2(N);
2 n5 S& J6 I+ ]* M7 Y float* b1 = new float[N];
- x; \ R* Y6 v5 c# y* L( J float* b2 = new float[N];
* s) v% P( ^2 A3 D
; P5 Q$ Z' Q# T9 c for (int j = 0; j < 6000; j++)
4 D2 I* d% I% {+ \% I {
4 s" c3 V7 }. C# {8 { std::generate(vec1.begin(), vec1.end(), []() {
, D* v5 d6 X+ L2 h m9 M" T return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));; X; `4 n$ w% B5 Z
});$ \5 W; W7 @9 I0 I4 D
5 r! @: h& C4 [) z8 w( K
std::generate(vec2.begin(), vec2.end(), []() {
9 T% q$ w! U& f0 ?! d9 P) s return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
& m% @0 n: K* k ^ });
5 M) a& a6 _1 D& f9 _0 w+ F! a$ O, w6 p. l+ [& o4 f
for (size_t jj = 0; jj < vec1.size(); jj++)
9 Z( p& n) |7 z' H {
# i# U( [& E9 t b1[jj] = vec1[jj];
4 _! I- p% \" E7 X6 r4 E }
: r: R+ Z+ G! V" Y* i* e- k! M) K8 f
for (size_t jj = 0; jj < vec2.size(); jj++)6 T6 Z1 z! S( N# U
{
' u7 w4 f; H& }4 v" T. O! p5 J b2[jj] = vec2[jj];) o1 X6 d4 b6 G' w1 c3 d
}
+ U$ a& a& F& N/ d8 x
% T# I5 M* Q! T9 b* C7 H) p //Method - 1 N=100000 247s
' c7 ]% m7 V7 ^, ~ ` //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
" h V/ s# l l! i 4 T5 D1 C- H$ V7 i* e' T
//Method - 2 N=100000 237s- s0 ?; _( B: }- v5 M, ]6 C
/*4 i% I( g# z+ i3 D0 w
for (int jj = 0; jj < N ; jj++): L# I' ?$ ^- K s
{7 W9 X6 I8 O' \
fresult += vec1[jj] * vec2[jj];, \3 {7 l1 Y9 w! c" l( {
}& D+ b( R) U3 d+ o% ?& K
*/
. {/ R2 k- C1 @( b |* F . {6 L5 n, Y- j
//Method - 3 N=100000 204s# [# F! t6 Y; V9 [. C
/*
; v9 F) [' W4 n1 d4 y$ d for (int jj = 0; jj < N; jj++)
2 H6 m6 T# ~5 b {
% Y) s- v1 d% o fresult += b1[jj] * b2[jj];* d5 p( N' V) S2 ] z
}7 C5 C' O6 N8 _/ A
*/
8 w4 X* d1 t4 S, D5 |5 A
- {6 [% U/ }8 M$ a% _/ U //Method - 4 202s
$ D7 Z# n: c1 b- ~; Y U3 z( D /*
8 ?1 ?, {+ L! r$ ?4 d for (int jj = 0; jj < N; jj++)
: H, q6 \7 F; E, d5 x9 e0 } {
# s; V# a: p4 m" h
' v" I- q; l/ ~' x8 y }
2 d- c% _# [! @" h- U5 i */
1 }9 E0 d( Q% H( I6 }& T6 Q //comment out all methods, N=100000 202s
0 O* d9 P ^; q; } Z- B/ l- P5 p }) J& a& X$ D- a
4 p, A1 m5 Q' A' u: H J, t
delete []b1;
- F4 p5 X( x7 l6 X delete []b2;
* _2 h6 P. B$ J- ^% U |
|