TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! S- R: S Y4 L7 e ^
6 Y5 B3 c0 v- j; m6 u理了理思路,重新做了一个测试。
9 b6 Q& Q6 a6 [8 \/ |做了两个 vector 和 两个 float *, 都长 1000005 W+ Y& I. v2 P, k3 [! x
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
$ G# B3 z* B5 ]# s) V4 o1 X: M. b: T- v
& Y* y7 g0 `' h- D5 j2 i内循环试了4种方法,
) i1 P6 F* J6 W' a1. 直接调用 vector inner_product 247s
; y1 Q, h9 G" C# Y2. vector 循环点乘累加 237s* ^$ ^1 b! R @
3. float * 循环点乘累加 204s
4 D! r: Z. m# q( Q2 P5 V4. 空循环 100000 次 202s0 [4 z* P4 ~) B5 N8 B8 P
. `" j9 O1 b, j, W' z# m
不做内循环 200s" h4 d. x# D! C }: m
6 x" [) T$ L: ^你昨天说的对,内循环本身占比是很小的,大头在其他处理。
7 R- g2 f( w! C3 a另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
: `3 n f: g! [0 E4 `9 x5 D, Q4 \$ ~ E! l9 r0 N
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
* @5 ~* A" `: b3 ]# W0 v% E$ W6 r; u9 V' g+ l
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 d$ s: t0 \# L7 g- O9 n7 D
% ?6 r7 G- Z* } std::vector < float > vec1(N);
6 [' a( I% n; D8 S4 E# k9 b& O" E std::vector < float > vec2(N);" z* p8 i& z. J3 K# ?$ `- w9 D
float* b1 = new float[N];# z5 J# `+ j" V; q* Y4 r
float* b2 = new float[N];4 t5 {1 m& L. E
2 L7 D# u4 |0 D/ }
for (int j = 0; j < 6000; j++)
; O# q# r( {) W {! B6 O" k( W4 v4 U
std::generate(vec1.begin(), vec1.end(), []() {" q, N$ d% i" m# }+ @+ D9 [
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
8 w) Q4 b2 I k, N& W& f7 [: Y });; J+ F1 M. I4 K6 w
. N4 e) t" m/ I: A# L& q
std::generate(vec2.begin(), vec2.end(), []() {* y7 t; O, F/ e, C! C' i
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
' w! ~- }% \& @$ [ l" c1 B8 C1 ^6 m });" ^+ g2 o0 T8 o- t8 i \8 J
1 h2 M9 `' w' n4 F5 P for (size_t jj = 0; jj < vec1.size(); jj++)! F+ S6 q+ H# u$ U& I
{
1 I0 a- v( A- o, q9 U/ S, U9 B$ V b1[jj] = vec1[jj];1 t8 i( F7 ? \* n
}
# Q' r! a6 }' o# {1 p' h
( \ m- ?3 Y" J6 H# R6 J' G) k for (size_t jj = 0; jj < vec2.size(); jj++)
# H/ B/ E: M! f {
: a* F3 I# e, E& |$ b/ a5 T b2[jj] = vec2[jj];
$ {. g1 K1 ^3 Z, Q* o }0 s7 X0 [$ E/ l
) x9 s+ A5 [# c: Z2 C' R
//Method - 1 N=100000 247s 6 `+ M) s$ k+ A. _2 X$ i
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
6 \' N3 M9 y( p& Q2 n) } 2 }8 q$ h: f1 E! S, g- n5 F
//Method - 2 N=100000 237s
; ?3 c! S& X# m9 |9 V- _# v& o /*& Q6 t: D1 s, F' |, p8 P
for (int jj = 0; jj < N ; jj++) A* A2 U- `& b8 {
{7 q- g6 N! V7 t- ^0 u" X' _/ v
fresult += vec1[jj] * vec2[jj];' ^+ x1 G! M: W7 L: n2 u: ^
}/ X& x3 G( |* a7 t7 O4 Y
*/
/ {, ^* X6 l, V3 A# V1 p
( b' {+ R9 N1 }) I //Method - 3 N=100000 204s
& Y% O5 [5 H5 [' ^2 p* y; e+ k /** J* ?" e# i! F9 n. ]4 ?1 A0 Z
for (int jj = 0; jj < N; jj++), w0 n- g5 q6 n+ S5 n& Q
{
?" r& S& @! _' j( k fresult += b1[jj] * b2[jj]; V. g6 f9 J7 J1 R! c4 W3 v
}
: o1 \/ t' x! S */( |% W9 `, M8 N$ S( _
4 K3 L! c" I, A2 z E7 t: M
//Method - 4 202s
7 @6 m$ u a2 R /*
7 n9 x; ^8 d4 D; `2 A6 D A for (int jj = 0; jj < N; jj++)
3 p; D: k; B1 j, o3 K2 L$ g {
- ]4 X0 i" j" N( r) Z8 `
" h9 [# ^1 F. X+ G }
; Z' y+ s$ C6 y */
9 h- C) H5 h0 i K5 V2 D4 O' C //comment out all methods, N=100000 202s
# `6 a" ^- X1 ` }
) y2 {, C9 M. a1 t/ I4 i/ N7 ^! ^
delete []b1;
$ N. B+ @0 r4 p5 H9 j- S$ }* w. Z delete []b2; 0 F- t1 u+ D4 P
|
|