TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 2 U p. G1 H4 p* I; d6 ?2 ?
3 G- x# O1 A; E$ V: }) ]- X理了理思路,重新做了一个测试。
$ u) p) t" q& ]9 W做了两个 vector 和 两个 float *, 都长 100000) k/ a7 r& H9 {* R
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
H% Z8 U/ {5 W9 t1 m
5 B \ m1 c. W) N0 i* R) z0 E, {内循环试了4种方法,( u- I1 ]. a# @9 h4 Z* @0 Y
1. 直接调用 vector inner_product 247s 6 a2 ?- x8 T$ w0 Q- H% P+ @1 c
2. vector 循环点乘累加 237s
6 F! ~* u; i; s$ p( ]3 W3. float * 循环点乘累加 204s, h7 B- q2 @8 ~' A% |+ I! e; C
4. 空循环 100000 次 202s- o3 P* q. Y0 P1 Q2 v( W
) {) S8 z: P7 H& f; L% G, g1 w不做内循环 200s
& {' `) {: K) f( _/ b+ J$ C% B7 ^$ i7 S
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
2 h3 q3 B+ M) x' m6 K( L另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。 C `( P+ o0 ]
A6 @) u( ~7 n% F4 u/ Q至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
- `/ d" K! E1 }! F8 U' V7 p1 N9 k5 P1 G' x# Y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
# M3 O D: y- u% A l+ t8 f5 C6 { L& R j
std::vector < float > vec1(N);
1 _2 ?9 D) J; ~6 j% s( L std::vector < float > vec2(N);
9 S" K$ H$ r9 w8 @% ` float* b1 = new float[N];
; B- n5 ^( f# F3 \* Z5 ^4 S float* b2 = new float[N];
p; U9 i. L v9 G# U9 e3 P' X, T2 e5 P4 r g+ v6 y' s8 A
for (int j = 0; j < 6000; j++)
! [9 [. v) O8 D" ? {$ F; y2 U4 i; H/ J& Q1 Y* K
std::generate(vec1.begin(), vec1.end(), []() {& Q# G* P$ S2 S: y, n6 ^) A. P
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
% @* j( z: B, ?( S. d });! t% R7 M& S3 Q+ ~
- g! L$ U# V+ E0 F) s( r q, s9 l std::generate(vec2.begin(), vec2.end(), []() {/ N( F7 q7 b4 K" x' A. K
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
) r6 Z: r/ i2 h5 r3 B });0 V# D+ j+ e: }" k) F
4 q) C$ N: a- f$ j2 q, T0 d1 Z for (size_t jj = 0; jj < vec1.size(); jj++); B# Q8 h/ |" b7 R
{$ _ I1 y: ]/ }; p4 M5 U G
b1[jj] = vec1[jj];
% H! |6 r5 Q( D; N. i }
0 c2 H: I" |/ M; I5 Z
5 Q; m+ ~7 v3 g" g K for (size_t jj = 0; jj < vec2.size(); jj++)
$ G( V. [ Y/ X0 V {* h5 d% Y( U2 o" }. N/ Q0 o
b2[jj] = vec2[jj];
' @4 B7 V. S7 @' h5 u }
$ r7 ^% M: B3 h) ?+ \ u. I8 w8 A+ _* P' J
//Method - 1 N=100000 247s
( X Y) w$ k2 T/ I% a6 j0 h //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
0 D' f5 e5 K7 }3 Y, \ & e, V+ V; [: |
//Method - 2 N=100000 237s
3 Z, h* ?6 M5 u+ k" H /*1 E! F. \& f" C0 K
for (int jj = 0; jj < N ; jj++)- h$ d8 ?5 \5 b& n& s* L8 G
{
+ r1 R3 E: ~) ]( `8 y) g fresult += vec1[jj] * vec2[jj];
0 G& h9 q: S' x- l( T1 j# \+ C' ?# p }, T" c( D1 q( ]' P) q
*/
8 ~7 p" \/ E7 t
- A2 E& P" `! q: G" a8 w$ P //Method - 3 N=100000 204s
# I' d9 G& H3 S7 W) k0 z7 R /*
0 k: S: B+ g& Z; h" b for (int jj = 0; jj < N; jj++)
6 F, z: S# J# C7 d7 J3 W0 e# |; J {
5 O/ @$ k: }# d fresult += b1[jj] * b2[jj];
% v; e" d3 N- W& l }: V; _8 Q6 X2 L
*/
0 u$ ]0 z: p L7 X. j' f9 L3 `' o6 G6 X
//Method - 4 202s
! ~1 g8 o% O* [+ {) T! ~8 h /*" D, W% T& ]8 `4 R8 v6 ?5 H0 a
for (int jj = 0; jj < N; jj++)
7 g+ T5 p4 H# h9 x, c1 L8 x {# L& y; D3 {# q
/ w1 K0 {5 e9 j$ C }8 C8 s8 J; _% U: u( Z
*/ \. Q5 n; x) k9 E; m7 j/ K) M
//comment out all methods, N=100000 202s
5 b7 h+ b' g6 u1 ?5 s8 j& y. ?5 g }
( [! w( Y9 w) R. F% z
% h2 w/ W9 R: } |/ F# u2 x0 ?* G# j delete []b1;) U7 Z) Y. @+ p k. X1 M; N
delete []b2; ) n6 ] t% ]+ L' c9 p7 u9 t Y
|
|