TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
0 z4 G8 f/ |" l2 `* S; @6 @* j
W& O S n2 o" g. z+ o理了理思路,重新做了一个测试。' E6 M9 v1 S5 X" R8 z, a" G
做了两个 vector 和 两个 float *, 都长 1000001 d" a5 o6 y+ G! A. Q
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.% Z' Y2 J8 \* I2 C1 }
- O$ O- b% C0 R: j7 ~1 Z+ z! F g6 A8 ^内循环试了4种方法,
" ]4 ?; \6 ^6 K8 U/ G3 r+ O1. 直接调用 vector inner_product 247s
6 {. Z7 f, ?% P$ J; s3 L2. vector 循环点乘累加 237s
, H$ |8 p) y1 X! w, p* q0 B3. float * 循环点乘累加 204s
4 {, \, g# W8 L2 \4. 空循环 100000 次 202s3 g1 w8 ]# K% f, X4 [) }
! w! @* S1 v% I R3 Q- b; y9 Q) J1 q# V不做内循环 200s$ M' n9 j/ Q! q' g9 D5 l
7 ]! g W @6 F, C, c4 }* B你昨天说的对,内循环本身占比是很小的,大头在其他处理。. q$ {; I# @1 D9 `7 _+ M9 d
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。; S! }: f( w$ S
$ e1 q! O& B) e1 C至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试); C! L* Z$ g# ^$ k; N& `
& ^+ z+ I. r, c% l
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL). X0 ?) x0 h0 g8 @0 P
0 Z( G' S u& ?' b* a2 ^9 D
std::vector < float > vec1(N);
7 z y0 I' o# k8 ^) S7 ^ std::vector < float > vec2(N);4 P j# z: J* w' B6 M, d, |6 A
float* b1 = new float[N];1 X# T0 v2 m0 p- W, @1 e
float* b2 = new float[N];
, R4 _$ [$ ?3 `/ V2 L# N0 n
$ v- S* u) {: y F: m& H3 p for (int j = 0; j < 6000; j++)
; T" _1 K5 h. [+ i {4 |' [; X7 K; g6 A
std::generate(vec1.begin(), vec1.end(), []() {' [0 @6 Q; A! ?% R7 d/ J# h
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
3 G# l) z# d1 ~- c, M+ L });7 a3 q2 s( g9 Z$ P: ?- e) T
, Z3 A+ e3 y+ g7 B std::generate(vec2.begin(), vec2.end(), []() {% {) x5 g* `) d7 _+ `- N7 A+ A
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, T5 ]6 ?, M9 U, F j# N( S9 y
});9 U0 _/ ^1 p) e+ {" B) F
j+ C" C! |# G
for (size_t jj = 0; jj < vec1.size(); jj++)
- X& x$ [$ B/ ^$ N {
* M/ S0 o1 i% d# L b1[jj] = vec1[jj];
' Q; S* z0 } R4 ~: i- a }
% f! l: A$ n+ B0 [6 I' @6 Q" `4 \; X. @" z
for (size_t jj = 0; jj < vec2.size(); jj++)
5 I* H* [$ s0 y6 z" _ {
+ ^0 D; p4 t5 G. M b2[jj] = vec2[jj]; ^2 k1 \' s5 N$ L+ {3 T* O$ i$ q
}# O& P- J/ C( w$ `/ {6 T
& e1 a7 F- O% U3 X" n2 \
//Method - 1 N=100000 247s 0 t1 Q0 s2 t) h7 f9 @
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. l8 N# M5 c2 e2 m4 _8 q- v # H" r0 L% K2 I
//Method - 2 N=100000 237s
2 J$ N* ?: O; ]& w# T /*
% O) W( t: _. T: a for (int jj = 0; jj < N ; jj++)
; F6 o8 J- O5 n0 L* b {) b. V5 p% g3 X f/ P
fresult += vec1[jj] * vec2[jj];
# |+ ?9 X4 u q' a: Y) o }
E! {0 D1 b( y2 |3 g! H */1 V- |. }8 K" `* K: M( O
4 V& X; Q: B, R9 |) o$ l+ N( u
//Method - 3 N=100000 204s4 `% ?6 F- L/ u. b( L
/*( a! Q# f8 h( d2 {
for (int jj = 0; jj < N; jj++)1 c" _* e9 l4 ]
{
8 A9 ^3 \' [- R" n fresult += b1[jj] * b2[jj];
6 F Y5 L/ D0 N. k }& i, @2 h, p; t0 M9 [
*// \' r) {0 F' o. z" U+ s) H
' j) s' S$ w2 I d& }
//Method - 4 202s
9 b* B9 O& \. \5 B /*4 r9 T9 y: w! I9 O' K- a& q# u
for (int jj = 0; jj < N; jj++)
1 t$ M4 h n# P- A0 p' [! _$ v6 s {, x, m0 h- F8 q% e7 P3 d
! W. F- T$ S/ n# x: }$ v
}1 D5 E7 d! h0 S
*/
4 |, @4 W0 T1 R% C0 T" r4 a9 v1 j //comment out all methods, N=100000 202s " q5 G! O2 O+ M3 U! C2 C6 K8 F& O0 Z
}
/ I% X" v( t" h; }9 R
+ }6 G% [/ L* x' | delete []b1;
1 e; u M* m* N: V' g delete []b2; ; X+ ]; U. n: r& S+ H/ ]+ t
|
|