TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
! i- _1 y) N$ A0 f! E( a" E# Z
7 S, v) M: n% M- U理了理思路,重新做了一个测试。1 H) K3 W) o$ J$ a1 r
做了两个 vector 和 两个 float *, 都长 100000
( s$ G# }8 J% c) z3 Q外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. [& A2 U/ C; t5 R- `
3 R' d! Z9 w) U2 V: i! l9 \4 z内循环试了4种方法,9 d2 `$ I- F/ d2 X }+ d# O
1. 直接调用 vector inner_product 247s
) T9 [* f) m5 o* l& X, u# Q( \9 g2 I2. vector 循环点乘累加 237s' r, s: W2 A4 P
3. float * 循环点乘累加 204s
4 Q3 w: c* q, m0 D' z4 G4. 空循环 100000 次 202s
6 |, j) N! x/ y- }1 j. N6 @& `2 Y+ X9 p9 p! S0 d
不做内循环 200s5 Z, h X5 ]7 h! T
% e2 C' K5 X5 z9 S你昨天说的对,内循环本身占比是很小的,大头在其他处理。
& l* `) v( X! h& Z/ P/ s/ B另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
0 \" v( w' v" a7 u! H- Y+ ^, \, g+ Z! L7 C1 H; W" @6 Z7 a* F
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
, u$ c% Y0 [& r2 _+ k- X( T2 B) u7 A+ W! R F ]
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
! d' G) E( ?( p& _' x, p( O; c W# V" ?7 I* m% J k
std::vector < float > vec1(N);. d9 ~2 ^9 r& j
std::vector < float > vec2(N);; G& j# m( U" D
float* b1 = new float[N];9 h+ D1 I& r1 d
float* b2 = new float[N];
2 ?4 s8 V( `$ Q- v( S! \* @
# o% N- l- k3 x8 Q for (int j = 0; j < 6000; j++)
) U. L6 w6 F; d; m3 Q/ a {
# S0 Z* C# z. }: p9 P std::generate(vec1.begin(), vec1.end(), []() {3 @$ Q% ~& S- v. a& |: z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
7 w3 B$ q; _8 Z1 B });/ S7 o$ {- l2 B' m$ Y* C4 A
& p6 m, x1 F9 q' O
std::generate(vec2.begin(), vec2.end(), []() {
' ?) E2 x, x3 i: |! [. ]9 g return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
S' r9 z: t2 R7 T/ L5 L });8 o+ _7 E( M% s9 e
2 Q( p- j1 I! e! c- x$ B
for (size_t jj = 0; jj < vec1.size(); jj++)
, j( g, V) u, S5 z1 x/ ]$ y {. o+ \& ]3 i1 F" b
b1[jj] = vec1[jj];# l6 e# R/ _3 u T( m& F
} t- P0 `7 F% e$ \8 ]! h4 ]' j. P
+ V4 q4 j5 M3 y) h( o7 U for (size_t jj = 0; jj < vec2.size(); jj++)3 d- \0 S% O. w0 e5 l
{+ N# a7 p9 _, ]
b2[jj] = vec2[jj];
# [# z. d* d( h* f5 J% s8 `/ A }
8 O) B, q$ \, v4 v. Y# ~, n
+ l% c2 `, ^0 s. ~( O- f; [ //Method - 1 N=100000 247s
9 u. H( M" A" | //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
]/ N# Q+ Q" P. v+ |: M. o- ? 3 |" w0 s% ~) N' { U
//Method - 2 N=100000 237s7 M5 v$ j( A" Q/ e
/*: b9 l; {6 w. U# A3 g# T' o2 H8 k
for (int jj = 0; jj < N ; jj++)9 i; y: X! u# G9 `+ \
{
) d9 N6 }/ t4 i. F$ F) q4 V0 R9 A# Q fresult += vec1[jj] * vec2[jj];
6 f4 X0 a* G W: k; S( n }% K& V( ^, U* f* o8 K
*/
0 t6 o* C' z# _3 |
* Y5 X/ t; e! A) v. t; g8 B1 { //Method - 3 N=100000 204s3 a0 j p" `8 o8 y" X; [. f1 g
/*" Q0 B9 {" y% @- H" o
for (int jj = 0; jj < N; jj++)9 Z; u! L" |5 H3 @, {% ^& u
{
! T; U+ o9 ]/ L% ~/ c8 n9 \) C fresult += b1[jj] * b2[jj];4 b' u( v3 _. ^ z
}
' p! n, L6 m9 n* T4 B */( W6 s6 x+ C( S8 C1 [6 S
# l! C2 w% R, p5 C //Method - 4 202s
4 v6 u* b" P: q( n7 {0 C /*+ q% v. D* m6 y4 H0 ]- s
for (int jj = 0; jj < N; jj++)" w7 y0 A7 [4 W4 }" s, k# Z
{0 g, E5 _9 x8 h6 N
5 g% C f3 M) n W# j) [" {
}& b4 L8 w+ U# l+ Q2 S$ d+ u
*/
$ |. {. k& U- a# E' S //comment out all methods, N=100000 202s * `% ]5 ~1 z$ p k
}4 J# \, m/ v, \+ D& |8 ]
; W8 k4 X( f3 Y: ?& e% ` delete []b1;% }) z! r) l# F% s, O# @2 i5 _7 J9 e! s* l
delete []b2; * i& ^6 r% D; |1 a: P, H. G
|
|