TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
1 j0 q) z& V# `& z4 m7 ?3 n& m
1 H4 _' E8 p3 m1 p% ]理了理思路,重新做了一个测试。
9 D8 ]; ^; f! E, ~; M: B1 ~做了两个 vector 和 两个 float *, 都长 100000" M+ w( Y2 E* M8 M( F
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
- T6 n4 A" r" \2 @7 T. G" X$ H$ y8 A! R9 r" I! n: M E/ s
内循环试了4种方法,3 T1 z l3 D# S5 s7 e* ?8 n: d; B3 x
1. 直接调用 vector inner_product 247s + w% k5 _; u& _$ m
2. vector 循环点乘累加 237s% A8 P2 k6 P( J2 s9 V# \
3. float * 循环点乘累加 204s8 g, p# H. X; |3 s( _/ v
4. 空循环 100000 次 202s
7 F$ u/ m5 g" F1 A6 ?, N+ \% W
不做内循环 200s
0 i8 L( `) C' s+ t; @1 j. M2 f5 K$ B4 I! A. I0 `: j' q' A
你昨天说的对,内循环本身占比是很小的,大头在其他处理。/ j$ E7 P/ y- R$ ^0 [. Q% X
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。% j% a8 `& v0 T) l8 G
3 ]% ~! r) t' Q0 N0 |% k
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
8 ^ S. ~0 `$ {$ f5 Q4 f4 V
1 v! q. I! Q, m7 i; ~(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
) P, H0 @4 a* M
5 o5 m2 f1 d* j: Y3 z std::vector < float > vec1(N);( z, ]5 k& i, S! g+ j
std::vector < float > vec2(N);7 K5 b6 c# q# ]% e Z, }
float* b1 = new float[N];
( O% S' V* d! P4 b float* b2 = new float[N];
: I ^% E3 ~/ W. }
& @8 _8 v q4 }5 l8 V3 C% t for (int j = 0; j < 6000; j++)
% b2 i' e# d1 Z# [, s {! P. Z. ]& ?8 f; H2 I- n0 B5 A
std::generate(vec1.begin(), vec1.end(), []() {
' ]0 M3 Y$ [% t* M. c# ? return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
: p* m3 S% D, S% Z4 }1 @9 r! p7 T });
7 L) A4 ^4 [( I" h H, l6 u5 n p. z- D( f8 |
std::generate(vec2.begin(), vec2.end(), []() {# L4 v* {% n# V! U0 J
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
' N- R$ k% l u+ M0 s( ^ });/ |2 Q" c. `* j8 F
" Y2 K3 I; W- I' E
for (size_t jj = 0; jj < vec1.size(); jj++)
, i' g' X& k; t1 |& K {+ ?) ^4 B# t9 R! P4 C
b1[jj] = vec1[jj];
: c2 h/ K- n" ?9 S( K }
1 n5 A. {( q6 y/ q# P
P o1 V0 f2 C- w4 }+ M6 c for (size_t jj = 0; jj < vec2.size(); jj++)
- D. @4 i& M* e+ [3 T Q! |; }. q {
, b& v3 X) n1 C; Z( }* t" V1 w b2[jj] = vec2[jj];
: I9 a s4 B) @; d" ? }
# } x' u5 v8 D5 B6 g; D* p. p5 q& O+ h$ `$ c1 U3 s& t
//Method - 1 N=100000 247s & f0 M' h. Y* U$ U3 O
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);- B- J' B3 F1 ~ ?1 ]% V
+ W2 m: n, z5 R: z- Q; w5 g$ e //Method - 2 N=100000 237s4 X- z' I( O, O q. M3 y" h
/*3 ^0 z! u4 _( N2 c4 t U
for (int jj = 0; jj < N ; jj++)
; ]- u3 ?7 `- i' t' c( f* j {( u+ P! W, \/ [/ [' u. c2 l7 N1 j
fresult += vec1[jj] * vec2[jj];
7 q) ]/ c5 ?3 [; P8 v }$ T! d t5 v& O4 g+ T
*/
; O+ s9 g/ U3 M( A" q" v
* o8 s; A2 D& I7 w5 J. q //Method - 3 N=100000 204s
/ X ~3 o% L' {' U# \0 Q /** b9 k* m& @* O0 r( U% D3 G
for (int jj = 0; jj < N; jj++)
; Z+ d% M6 B) _& z% I3 _8 r; x( i c {" D$ Q E O1 ~" U& V0 e3 `' g
fresult += b1[jj] * b2[jj];) b' Y& D7 g2 V
}
0 C4 y$ o: D: v8 w */
8 D% O: |8 K- T* s% K) K. w+ _# u& B4 q+ v4 ~1 r) {; \
//Method - 4 202s
5 [5 e, K( t) ~! _, q4 _' y' D /*/ H+ m% ]3 Y% z' D8 z# {; I+ X
for (int jj = 0; jj < N; jj++)4 L& {) s" Q( `1 O8 P+ V$ q% |' y
{
t& H" Y% H) X: T! W* D
/ x( S# c/ }6 T9 t( |4 ~ }
6 r' O9 o# I L8 k9 K: o4 X */
1 N0 l5 w9 p, J% J" K) [+ s //comment out all methods, N=100000 202s
* i5 f& Q4 S2 ~- o }
% S: O1 v2 z h8 g/ h3 ?: x; V7 B& W# y$ k# z# o3 k
delete []b1;/ `6 s E. d; e7 y
delete []b2; 3 d2 w z# R( [% ~4 n. F
|
|