TA的每日心情![](source/plugin/dsu_paulsign/img/emot/ch.gif) | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! {5 @; X$ k9 Z4 \1 J* h" k1 f
$ c; c3 u- K" z( _: S
理了理思路,重新做了一个测试。9 P3 T2 P4 B9 u* i- n( E j5 V
做了两个 vector 和 两个 float *, 都长 100000. L! N' {2 {& H# ~
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' L$ i) e( B" I+ b! f
0 w" E( W* `0 v5 [3 A2 a) V y
内循环试了4种方法,
8 u# X/ f$ \1 e4 z1. 直接调用 vector inner_product 247s $ i/ K$ H t1 T' o" y0 w
2. vector 循环点乘累加 237s
5 Z/ t) X0 O$ I9 @. G% Z+ m6 E- H3. float * 循环点乘累加 204s1 b3 H3 p, t# X
4. 空循环 100000 次 202s# W* H. K+ J7 c& _# \3 F5 J
0 r; Q: N: v! _+ }不做内循环 200s
; {& h( O) F- z( g
& {. q. n9 J& E你昨天说的对,内循环本身占比是很小的,大头在其他处理。
' B1 `' l9 j; l另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。; @3 |0 r" k' c& F: h7 M! T2 B
1 X* m1 _ ]* `1 G! [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& ~& h, G2 ?& J, T8 O$ n
0 s; O( G* W j4 D |(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)! j( X1 |% ?1 k4 S/ G; [0 Y# @
0 Q3 I4 I; {' P std::vector < float > vec1(N);
7 K' w3 u% `* _0 N6 m std::vector < float > vec2(N);, ~; V- d2 P1 o s5 b2 D+ S
float* b1 = new float[N];, v) X3 h/ |0 W# b
float* b2 = new float[N];% q1 E. |9 A. k1 E7 h
" ~- j7 ~+ u' H; v
for (int j = 0; j < 6000; j++)/ P& s& g z( r* R7 h7 j7 B
{
/ _0 G$ V9 A1 L. [( W, @ std::generate(vec1.begin(), vec1.end(), []() {- w. _: b& @% v9 e
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
# E% a3 \) j V) F6 m* s });
2 C' a) C n$ E' V) P+ Z- y" C" t* X, u3 ~$ o! [
std::generate(vec2.begin(), vec2.end(), []() {! x2 [, Y r$ f, B9 a; F( r
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
+ }2 x M2 H9 U5 w, w! L! H });6 R' b' { [& T0 F C& G7 J/ ~
' u3 Q+ r3 s' y for (size_t jj = 0; jj < vec1.size(); jj++)- c% n- x5 p3 f4 R
{2 ~/ C4 ^# F" ~: _1 g2 ]2 P
b1[jj] = vec1[jj];2 J" Z+ I) K& F. g& g- ]
}6 ~4 Z* R* i- T+ s `7 v: {
; k$ a. q# |! y
for (size_t jj = 0; jj < vec2.size(); jj++); ]/ L3 H/ k" [2 Q \- n
{$ r3 W y) J: Z
b2[jj] = vec2[jj];
5 N3 z' b4 p( L9 U0 _4 l* d }% C0 ]5 U7 e+ @1 j: A5 b' q3 y
" o2 H! y5 t7 P! D2 ]$ g
//Method - 1 N=100000 247s ) w: U, n" U6 W# u+ w
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; k! q0 X( a* E) ^$ G0 k2 i2 E' Y0 c
( F2 {2 \+ o/ | N //Method - 2 N=100000 237s
; D. E4 @2 J; P5 ~ y /*8 p" M5 c2 S; @) p9 A! D8 l7 f
for (int jj = 0; jj < N ; jj++)
8 m4 K! n! ~6 r/ X& A { r- h2 y* h4 O$ y; q; p6 |
fresult += vec1[jj] * vec2[jj];6 M0 i3 y N: X" `
}
9 N# n e. f% o) j */
! ]1 Z. X6 X# T9 V
/ O3 A8 m* k. W& L //Method - 3 N=100000 204s, O$ l0 V7 r5 r) k8 s
/*3 F1 x% z# a; Q
for (int jj = 0; jj < N; jj++)1 ?6 B4 \+ e5 G* `
{
0 [; E/ N1 U U" J N fresult += b1[jj] * b2[jj];
, N# g6 E, k; P9 i/ f9 B5 ^8 t }9 ~5 ], Q% b. M0 \# P, u$ j, @+ J7 D
*/
1 q# `: f8 a' j; G
% R7 V# k* O; l //Method - 4 202s/ N' m. O7 j2 m
/*
* L5 g" w0 w( o/ |4 m @$ x7 u for (int jj = 0; jj < N; jj++)
4 F. r6 o2 w6 V- t F6 s {& r6 a: h- L% U2 p
" t$ k% v* C# W( l" x
}
( z6 W7 {) R" B/ C! W" d; Q9 s */
/ v) k3 K4 s# j* O, ?9 ?" y //comment out all methods, N=100000 202s , T% H, t" y+ T2 ~% e o- v* X
}
6 N" I% p1 y: V8 ~8 q/ Z3 ^
" h7 W! Z: S' e" v delete []b1;" X& F" @4 q* s* \
delete []b2; " l8 p" V# u- o* m, x" h
|
|