TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 . ]. a1 g7 K' [
% l+ i) Q6 q: s, Q& h) p8 k# F理了理思路,重新做了一个测试。
0 C4 W* Q8 @# [5 ^) o做了两个 vector 和 两个 float *, 都长 100000
/ T0 P8 z2 h7 J; t外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
% ^6 c6 V& ]: D% L% i( |) B
1 g# S ?3 W2 a( F7 ]9 k, c) |- M5 G内循环试了4种方法,
& g- W3 O8 @& n& `1. 直接调用 vector inner_product 247s
5 y9 K5 p$ f, n+ Z, ?1 _2. vector 循环点乘累加 237s
) E4 b) E7 q' F# e3. float * 循环点乘累加 204s# R4 p' u! U/ ]) T( ?, W% n
4. 空循环 100000 次 202s: M1 D% d4 Y. q0 G
. W/ w" z6 y, ^; n1 _! Z5 U( h- b
不做内循环 200s
+ S1 W" v, Y7 |9 d2 N# h; ~ \! I& Y# z3 @- u# |+ h
你昨天说的对,内循环本身占比是很小的,大头在其他处理。( ?, B* y+ X" M7 k2 k% s& ^
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 s! ?! x7 r( l) v, b9 B
& d& y6 v. v; ^7 S4 y: X至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
! P7 S0 k1 c: w) n0 l& M( z; P$ \2 s0 L
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)! i1 h* x4 q. A7 f: E
I- i6 b* [9 X( h6 ^5 d% l4 C std::vector < float > vec1(N);$ \- \. F* @( D+ |" i
std::vector < float > vec2(N);
6 z6 {8 @6 i& f- \1 F" z# M% } float* b1 = new float[N];
* ]& V- L( W# n! m& b* } i# O float* b2 = new float[N];
8 V3 p, l- t6 a! R) f1 S8 R$ D" H" n1 r# P0 g8 a: U
for (int j = 0; j < 6000; j++). w1 ?4 \, L/ z4 p. H
{
. j3 \, |+ a# P# D3 m std::generate(vec1.begin(), vec1.end(), []() {
- }; C* d% g3 Q9 T; ?# v+ C return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ k. [: C! B, y' O r
});# e7 M2 l3 w1 Q, v" g
) Q8 Z2 y6 O# q# z std::generate(vec2.begin(), vec2.end(), []() {) V6 ^4 y' r: ~4 g- C2 C0 S2 F- T# i
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
& Z& c+ s5 A& ~/ |! D, a# f* n });
$ w6 O" V1 x" Z. v) v! d5 @' N5 c! J' j1 T0 c0 e% s
for (size_t jj = 0; jj < vec1.size(); jj++)% b9 ^, ^( R2 ]7 y- g
{
6 {( j; M& Q1 F1 s b1[jj] = vec1[jj];
# b b2 o( B/ N' y# T' f" c }
7 L6 y7 T/ S7 s6 d1 e# y- w8 ~$ S: ?9 g% _" p+ a5 F. j- Y' o
for (size_t jj = 0; jj < vec2.size(); jj++)
. t* X. E& [% Y: l" `& N3 K {4 k; \8 \& C4 h. i) H3 e8 }% O
b2[jj] = vec2[jj];! z2 Q4 _6 P" y$ R( v# X7 L( d/ C& D
}
9 E0 @9 M$ _0 K6 ^; S! k
# I2 w, f: O9 P5 D I7 f) G //Method - 1 N=100000 247s + ~! \0 s) c9 v5 K- ^+ [4 O
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* x' d9 D! v7 m. W
9 E" X- G4 u. q6 G
//Method - 2 N=100000 237s. S6 W* M% [4 w. R
/*
8 b5 q$ X$ R, E9 ?" y for (int jj = 0; jj < N ; jj++) l- B4 e% m; V9 o% v' r6 ?7 f
{# ~( m$ F6 U# a* x
fresult += vec1[jj] * vec2[jj];8 y' f0 }2 J' b7 E! K) }8 I
}) _4 P( U. H2 H/ Y7 ?
*/. j7 |1 |9 \) O) k1 q$ [
4 j/ j; Z, x2 l) a( s
//Method - 3 N=100000 204s0 k% ^" h/ `* W2 [3 q: R
/*
) [$ q$ [( d" i& y for (int jj = 0; jj < N; jj++)
% E7 e& E# f |% | {8 @$ D8 d5 ^6 W( D( }2 ~/ V
fresult += b1[jj] * b2[jj];
8 C, D: y6 R8 G }
2 L% o6 ]. }' ^* X" Q */
9 I2 L/ p- p9 [3 _! L0 p" J* h" n9 N- e5 t! D4 {
//Method - 4 202s1 }8 l. Y- T" s
/*
. X! U/ [6 H' T# {4 j/ s6 T! ^9 m for (int jj = 0; jj < N; jj++); v" ~( {. Q' B m6 `
{
+ x- \) }3 I6 ] , i# |7 F$ b" s$ P& t" v
}% Y( _* x- T0 S5 i2 `: B
*/
& Z4 M4 a1 L" z) T //comment out all methods, N=100000 202s 8 i5 Y6 L, R4 |1 ^$ J, x
}
; |1 \+ G. Z' ?8 D' T$ n) i* x! @( h; h* L+ i
delete []b1;
, m; E! m( }5 F- ~6 m delete []b2;
8 i$ t) Q1 \5 [' t( Y | |
|