TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 5 f; R( v( R8 p, P' W5 Q, }
% _, L/ Y- Y4 _; q& o
理了理思路,重新做了一个测试。$ j- P" B# S7 b3 e
做了两个 vector 和 两个 float *, 都长 1000003 ~& G5 Z8 M6 N" `
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' L7 S- k" K& ~6 b# @6 T: d$ ?$ p9 B! ]8 y
内循环试了4种方法,* W# l0 [; X: E. U% [+ P
1. 直接调用 vector inner_product 247s
* F* t& g2 ~# ]; N2. vector 循环点乘累加 237s# l" {, W9 d' w' y! {% X! J# D
3. float * 循环点乘累加 204s
$ d" n- V" G" }5 o0 ~4. 空循环 100000 次 202s3 }3 R8 n, ^5 t; J) R% H# z% E
$ y2 M8 G- _- [$ ?' p& j不做内循环 200s! A! a( Q$ m- r# {
' [; C* A+ ~. V Y你昨天说的对,内循环本身占比是很小的,大头在其他处理。
u9 q% X% o! ?/ i, j另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
# k1 i3 e. u+ k& ^8 P# I" |# Q
: }4 Y% Z9 i% h. U至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) i+ C9 |( P/ h
" P7 z4 o9 ^6 @6 V2 Q: E(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
4 ?& m8 Z2 I3 U" \4 T
9 K+ t3 G: w0 _( D std::vector < float > vec1(N);. E- |8 D) ?3 z r! u# [
std::vector < float > vec2(N);
- p3 p8 ~! z. r t float* b1 = new float[N];, u- {+ i; |5 D6 J0 j+ Z2 F8 W+ f
float* b2 = new float[N];( E J; [' c$ s% f
5 q# O0 ?9 @9 [6 G/ f
for (int j = 0; j < 6000; j++)- c2 H0 P# r% g7 A- [" D
{( W# ]7 U x! d6 n
std::generate(vec1.begin(), vec1.end(), []() {4 W- k \- v4 K1 X1 {/ e" S' d
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
4 ]6 P1 A* P# o G$ a) ~% ? });. E% O+ `2 c1 G% F6 P0 a* ?7 P% \$ S* [
, V, l) o' S+ G' V6 D' n2 W' k; F
std::generate(vec2.begin(), vec2.end(), []() {
k7 W: S$ |4 w" U) T return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# I& Y6 ^ p; a2 D7 w
});
. F) |+ H7 Y9 R
9 @( o$ h/ ~+ g/ R1 [ for (size_t jj = 0; jj < vec1.size(); jj++)/ N4 a4 U0 g9 L2 Q1 M
{4 F7 H5 Q( M% Q* ~
b1[jj] = vec1[jj];8 X' p& O: L) G) J# o c1 z
}- C+ s3 p j4 K4 e' {" d" R k
6 N7 A1 E5 M( ~0 m0 E, f
for (size_t jj = 0; jj < vec2.size(); jj++)
& H6 s, |6 c2 v$ ]" v {
& V. O5 b. ]# V2 W, _ b2[jj] = vec2[jj];
3 y# n: t3 ]) ^5 c$ H& [3 e }4 W9 a- D* o$ I& w1 s
" c1 F8 ^! V' V. \6 D //Method - 1 N=100000 247s $ ?( D& z6 Y$ r% H/ a0 [) s
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);, X, C7 k8 r5 t& H2 ~, j
( k& H2 t. q& }8 O0 j9 V //Method - 2 N=100000 237s# q# b; }+ I$ X/ f6 T7 e. a" w
/*( ]) u3 F! W& U" |
for (int jj = 0; jj < N ; jj++)6 A' p) D$ r5 e+ y
{: H2 o/ k3 X; ?% W9 `+ X
fresult += vec1[jj] * vec2[jj];" F' ~9 ~- V: e: |2 ]# g
}
- f% h2 _6 t+ { */
1 E! n1 h+ y( F! @" f( J1 a5 a
$ I1 f; R& S @ //Method - 3 N=100000 204s
7 w0 P% H& d4 f$ F" z( t7 u: [! a4 j /*" Z- C" F, T4 {7 Y! J+ z3 D$ F
for (int jj = 0; jj < N; jj++)
6 f2 H( l* ^5 F) E6 ^ {
) j! y0 [( J* q4 P6 t fresult += b1[jj] * b2[jj];) D, G; \" t4 S% l3 }6 N& j$ v
}
1 y) T+ m3 K5 m */
/ P a4 w$ @9 u# e7 Y3 | L. r/ z$ K' k+ N% ?
//Method - 4 202s0 ]/ a- h/ n7 J" w
/*6 |3 O! A( U: l+ n L9 J: C
for (int jj = 0; jj < N; jj++)
+ [) d6 a3 K5 z9 i- F4 j# X {
9 `# M' ?; _1 F. x' Y , b6 Z, w$ g3 ]% r) n: @( d/ v
}9 r; E+ O$ E) _
*/
* X% q! _4 h3 |( \- W) P0 P //comment out all methods, N=100000 202s " M& m: T# \$ C1 O4 y' t
}
1 c! _! g1 o# Z9 a. b- y# [$ |7 c6 p: J1 k$ O/ x
delete []b1;$ r0 _) t& M' @
delete []b2; C3 m o- \; J7 M$ Q; ~3 I
|
|