TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
; L: x7 a+ b, C- [+ q8 d% X' F W8 n" r% W0 o+ V$ a$ V4 @
理了理思路,重新做了一个测试。
9 M$ i4 W) s$ Y0 |/ m' q做了两个 vector 和 两个 float *, 都长 100000; d* ~% ^& r% \* l3 u0 u; Z
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
1 U. }- k" P# I$ D, j' T( A) `4 V0 j
' p0 m- C4 N0 ~; M内循环试了4种方法,
- E2 c, p; ^; v8 X7 `3 j& `" u; T1. 直接调用 vector inner_product 247s
|8 U& e' M+ [# Z$ v" B- E2 B2. vector 循环点乘累加 237s
2 W$ {# {) s$ V2 n/ m3. float * 循环点乘累加 204s
. x9 {3 N; `' `- T8 Y, e9 r4. 空循环 100000 次 202s
; e, d3 p- o' S/ Q! G ]4 ]1 ?9 Z4 M7 Y
不做内循环 200s
( z1 }# X J; X9 |( o" X, b& K3 w3 F( `- D2 ^
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
4 {* m; _* l p, m7 K3 H另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。2 Q9 o) x6 u7 F( Z# c6 k" V
, t. S9 n' Y4 p
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
5 I7 ^+ _1 S4 r% r, ~- m6 ]: x
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)) R g- w. J8 f* t6 q8 C: p
( A$ z [+ W# X* s
std::vector < float > vec1(N);
( f% K( A; ^- t# Y3 T* Q std::vector < float > vec2(N);! v' B% ]$ u# n& f t. ?1 w) W
float* b1 = new float[N];4 O; ` G6 v. v0 [) k: f
float* b2 = new float[N];
- G6 t4 S# Y6 l& }* O
! |' Z/ d4 F2 B for (int j = 0; j < 6000; j++); P# h- I7 K f+ ?. W# R: i
{" L% v/ v5 E. Q
std::generate(vec1.begin(), vec1.end(), []() {
# |2 A7 q! T8 b, Y0 p) V return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
8 D1 r2 J" g/ B5 d1 m$ w% I% u+ O });4 v; u8 U. t1 j5 J4 n k
' f. N g- D" A, u! y; @ F
std::generate(vec2.begin(), vec2.end(), []() {
; w" x5 p. F" x7 a g* z6 R' Z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;0 e3 T" o q# ~- r! }. c: {
});& x: B T1 f2 J% e0 h+ N- n
) a6 K) S6 N- X for (size_t jj = 0; jj < vec1.size(); jj++)3 V" E8 u3 s: v
{. T, f. b2 ^6 ?3 G& N
b1[jj] = vec1[jj];
4 J8 [& y5 q6 O. | }
. j b* D' Q# c$ \* J6 k5 ?! S+ z. ^
for (size_t jj = 0; jj < vec2.size(); jj++); w N! g7 S3 P9 P* |5 }
{: }9 f% \/ \! H0 b; x9 ?. a' S! ^
b2[jj] = vec2[jj];
. m; A% F# O% m. T }
0 m: Z8 |; ^# O" I4 `, g& f, C. w' o
- V A/ z4 X& \8 m- Q //Method - 1 N=100000 247s
+ B, b3 \* ?; O/ F$ t9 Q //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
- H6 L" O I) x. C( Y' \: L + H. |# h9 f$ L. G( f0 F* z; J
//Method - 2 N=100000 237s: e& z/ r) g2 [1 P
/*$ {. r% R$ ]& k; ?: x1 ^
for (int jj = 0; jj < N ; jj++)
5 Y# n, X0 s$ W) {: f( ] {0 ` g5 y, k) T: U, w/ |
fresult += vec1[jj] * vec2[jj];
7 h2 N5 [- W ?9 f }
9 b# ]' M2 \ I9 [2 ?5 y: ` */8 V8 K3 l% T! ]& E
, z$ h! S8 a, t2 s$ C
//Method - 3 N=100000 204s9 G& l* L) Z' Q8 i
/*7 i- w: T2 M( J5 I) t E
for (int jj = 0; jj < N; jj++)' n' i# K$ Y9 i1 I& u8 I. \6 V' Z& K
{
9 V- `2 V" i' \. A- X% o: m' K fresult += b1[jj] * b2[jj];! K+ A, {! i8 Y+ j9 l) f' D
}7 K0 m1 Y" e" f
*/
' G) Y q- \7 w' N: C Q) @
$ }& e' T+ M+ z# C! J //Method - 4 202s& ^. ~- j a Q! p# K. X5 Z' h
/*
) R+ }, g) A$ v ] for (int jj = 0; jj < N; jj++)
0 ?: m ?* H+ K4 R+ z1 m {
. y3 i0 {* l$ [! `& d% a
( u% `- m. z( F; J9 [ }0 E# S4 U3 p* k
*/
/ R# K. Q- H" y4 J# p+ T7 U8 X& i //comment out all methods, N=100000 202s 2 m; |8 ]- y- }# o% e5 C
}+ h2 t1 P4 d* A/ G% b
7 `0 b0 a" ?+ ?6 s* j; O0 z9 f delete []b1;
' V. j& |' @ \% V: Z( m( `" ~ delete []b2; : ]- s, {: Q- l# Y7 m" ?
|
|