TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 * o4 h! g6 N, C2 d. X$ c* g
" S6 m7 f% `' M8 m1 g2 p9 K
理了理思路,重新做了一个测试。5 }0 j% X4 C" ^
做了两个 vector 和 两个 float *, 都长 100000
9 Q% y6 T6 Z3 X' a2 t8 o# k& S9 C外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.3 L8 B I2 L4 n) y, M( U$ U
& X$ Z# l+ P% p* {) l* B内循环试了4种方法,
& K% P R3 m# A( Y: c+ B7 a1. 直接调用 vector inner_product 247s
. N1 _3 U5 ^' f( A& |. h! T, V2. vector 循环点乘累加 237s
- _8 [* w* Y, q3. float * 循环点乘累加 204s
' c4 K% i% ~( T ?7 X7 h+ I4. 空循环 100000 次 202s
* w, \$ `3 E5 H& g2 [; T. q, e, s' x: Z7 e4 A2 E3 [3 X( ]; k; b
不做内循环 200s
& @% L! Y1 p4 l2 F2 A5 S' g+ r1 ~% W) W1 }/ q
你昨天说的对,内循环本身占比是很小的,大头在其他处理。& i, W! ?! G6 T8 c5 W k- b
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
8 p4 n/ g6 S! ^, z/ O
7 [. n2 ~+ [2 L5 K至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)4 ~' Y g/ h/ G6 U: W
, f# s H. _& i* e, j1 l$ D/ Q(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
) P9 A/ J& U( I" x+ I: B5 ~* g' I/ ~+ w
std::vector < float > vec1(N);
- [. |& a9 t( f) x& `1 E std::vector < float > vec2(N);0 c$ b# S0 p7 A* E( R, [5 V
float* b1 = new float[N];3 `9 u( W7 |0 V: C! [
float* b2 = new float[N];: Z' V, ` I9 D% Q6 v$ x8 N6 W
4 B& ]3 S. i& v1 M& t4 k& W for (int j = 0; j < 6000; j++)7 \+ g; u- Z- k# N& @( G A
{
& B. \, S& |0 r& r- z std::generate(vec1.begin(), vec1.end(), []() {
' \2 {$ f4 n. s/ I0 A9 { return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 y( l& E( ^% `/ p( R
});9 r: U) z) K' a( X) r0 p
( I/ L* T1 C' u: J. f
std::generate(vec2.begin(), vec2.end(), []() { V, W) Y. V( n9 F% y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 w$ V; J+ s- y0 U2 p5 Q+ n1 K
});
z! m' V0 A8 v" M( P' F. P" L0 C4 |' Q+ ~9 z/ E% U
for (size_t jj = 0; jj < vec1.size(); jj++)& m6 x4 x$ P% d$ }$ \
{
9 c6 T6 i9 l1 \- T b1[jj] = vec1[jj];$ o1 V: B0 t9 z) u8 J
}
% @7 w$ V- q, M; x5 r2 L4 G* t
# z7 w$ g( I! q! b( S for (size_t jj = 0; jj < vec2.size(); jj++). |+ l2 P2 e$ [$ q1 k/ K4 l7 B
{
0 q9 p2 P$ \; n) b$ f9 O: [, M b2[jj] = vec2[jj];
8 f$ B W# g% s0 j }# ?9 i) I" j; o# N
8 ~6 J3 q9 [" N0 W
//Method - 1 N=100000 247s
; p! q0 h X. R5 ] //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
6 {7 X" c5 i3 p9 D
& D1 }# @6 E- ` A2 v! C1 G //Method - 2 N=100000 237s- Z/ L/ T1 O s& k4 Z1 @/ j
/*
$ g+ y8 S- L9 v, F3 N6 ? for (int jj = 0; jj < N ; jj++): Y* C% ^7 K5 e2 w6 r5 z
{
8 y, U' W+ M: g/ N fresult += vec1[jj] * vec2[jj];
) l+ a9 b3 e3 L }4 ~( ~0 ^/ h4 t/ J
*/& M) ] r8 z0 v
2 r' ~1 h7 j" J4 ^6 R, e4 \5 s //Method - 3 N=100000 204s B7 C4 l9 r, Z8 F0 n
/*# q4 g, B7 {) I% H. @
for (int jj = 0; jj < N; jj++)4 A6 V, _$ L& C
{% E+ d: _2 H, E9 \
fresult += b1[jj] * b2[jj];* |) V) p8 H/ a( J$ I3 u
}
( E. ^* _7 \! b. B$ F1 ]/ G4 V */: U/ d$ _/ N& C, M0 i- ~
+ C8 }" H6 ~- b) o. j- P //Method - 4 202s
$ s6 z8 I9 q9 ]: @ /*
, y* f0 O' ^7 @ for (int jj = 0; jj < N; jj++)
% Q% ?: R) T4 B; J- @ {
: l7 Y# U T8 h
7 w) ]- j. o u {4 L( i# s- t; Y' f }
7 ?: y- i( F1 p */
$ N$ y4 Z5 ~& S; A0 t //comment out all methods, N=100000 202s % o7 i( `8 I( N. P; J
}
. V e6 N% W3 c/ w
4 c h- ^! b3 T7 a delete []b1;) A8 s' K! s7 |
delete []b2;
3 e# Y9 e0 _" o4 {: u' h! n4 `0 U |
|