TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 0 Z' h( F+ J- l K
8 F/ k% T( j: C7 ]. H3 \
理了理思路,重新做了一个测试。5 P0 O2 d" M* o; m
做了两个 vector 和 两个 float *, 都长 100000
: ^. z2 V0 m. U. L外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 u0 Q0 V1 z% m& E8 n
: G! T& V8 R9 r2 c- J内循环试了4种方法,
; {$ F+ q: F! G3 W$ m8 U1. 直接调用 vector inner_product 247s
3 n$ X! v8 p4 V/ h! c( H2. vector 循环点乘累加 237s
7 U) Q4 `7 c3 Z- C/ n9 M3. float * 循环点乘累加 204s
4 R: Y$ w, y4 M3 Z% U! q1 ^: s. b4. 空循环 100000 次 202s, b3 @( t( D, n6 z5 @
5 j# m5 H J9 J! L, w A不做内循环 200s% y W; H3 X& t) q5 l
, q4 U8 A$ q+ _; I你昨天说的对,内循环本身占比是很小的,大头在其他处理。
0 X( N9 X$ B# V+ Q$ p& {$ z& }另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
( o9 B1 F# s# A6 u, P
5 A$ L7 a, T( k- X* Z至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ r# m9 Z; h' \, U
( }% t' S" q' l G(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL), B; ^6 _* n& s8 M+ s5 w
9 o: q" D+ @) M+ |/ L$ B8 p std::vector < float > vec1(N);
3 a/ b6 W4 M; @7 e7 T- _0 i% v4 r std::vector < float > vec2(N);
2 I: l, [* h! @8 L float* b1 = new float[N];
; K5 w* ~+ e( R& ?+ o6 a float* b2 = new float[N];
8 c2 a, g% R0 `0 Y% b5 [3 t
9 I4 n( B) j! k' a7 a for (int j = 0; j < 6000; j++)
6 k7 z6 b) ?9 W5 X) h* S/ L {! N9 E3 @$ [7 u: d7 s6 G9 e5 r
std::generate(vec1.begin(), vec1.end(), []() {
. v; F5 u# C( C8 r return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 ~- i' V4 r9 \) F
}); b& {! x" r& ?: O
) R$ U8 p* {9 d$ w std::generate(vec2.begin(), vec2.end(), []() {
) U( h2 [2 [* p1 ~* n return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 C! D+ n5 Q, H" B7 X });! j- |# Z3 B# e2 W, f- M2 ^' U2 V
$ N6 ?/ b# B9 R* l, n% | for (size_t jj = 0; jj < vec1.size(); jj++)' E8 ^9 V' N. ~3 W c U
{7 E2 n8 I: y( U: h
b1[jj] = vec1[jj];
$ f$ p% N! |' [, q4 f% t }
9 ~, b4 _- E8 l7 E. q, d" E$ C2 ]" c* Y7 j+ Y
for (size_t jj = 0; jj < vec2.size(); jj++)
( j! ]7 b" _( H R/ A; o {
) v8 r9 p+ L! `' A) ? b2[jj] = vec2[jj];
& b7 S: h$ F/ ]" X/ J# `+ R+ h }( m' N6 }, a/ P; `' H% M
0 i; f0 s: [; R) O! _ //Method - 1 N=100000 247s 4 T4 ], D7 }, k+ R) ?
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. z# K. s1 {4 ]; p
% }( }: |3 C6 T; q; f
//Method - 2 N=100000 237s# }$ r9 r' t5 y& L; x
/*
% f7 n% Q% q6 |9 L% [( q; b" y for (int jj = 0; jj < N ; jj++)3 J) s) `! e- \+ g2 j
{
/ m5 T/ y4 N+ O) i6 ?" [ fresult += vec1[jj] * vec2[jj];
" R. i2 X; T- k( @/ H3 V }$ a9 [$ n( S6 s! {) [% M
*/
( r5 I: }9 y" y* @( f 2 f1 H& l' m1 W7 f) N4 C
//Method - 3 N=100000 204s0 [( P; Z* e5 Z2 Z
/*! k& Y1 t* m3 f6 `
for (int jj = 0; jj < N; jj++)
) r! k4 R7 B, T {( A7 s9 I! {4 s: u, l: A1 K
fresult += b1[jj] * b2[jj];
/ J/ q% ? j/ A: U9 q: n' ` }7 V: x6 h5 D7 g
*/& I: F$ u' d3 V! u, d. G( I. a
1 W3 _- n9 l4 m. C4 G+ i
//Method - 4 202s
1 x4 _ u8 ?7 t$ V* E5 q /*
! _0 W/ @7 i' X! S3 M6 r2 u for (int jj = 0; jj < N; jj++)8 [0 g7 G5 F0 ^
{8 T# L# {% C6 Z4 ` Z( F5 c
. m/ c8 k7 X& `
}- D/ J" E3 z! l, d* S( _
*// r# F/ {" y6 T! a
//comment out all methods, N=100000 202s : G" J: d! ^' ~' z/ U9 v7 e
}
9 W* [/ S" u' @3 x/ Z; }9 V
' C+ k- U4 @( H* e/ c4 P! @ delete []b1;* |4 i$ X+ H2 o0 W& A
delete []b2; ) x o% S8 l7 E- X4 e
|
|