TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
8 O9 c# Z: R; c @- {5 E& v) ^% @7 a& I$ d6 b: @0 @/ S1 @4 Y
理了理思路,重新做了一个测试。' ]: n6 g' N9 J, p6 p( O+ D$ c
做了两个 vector 和 两个 float *, 都长 100000
: q9 L; V0 c- K5 M' A6 t外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.$ S, M$ ?! l, {8 M9 `) t5 s& t- R
. t* i- X2 `- I u2 [/ p内循环试了4种方法,( G( S7 `3 m. H7 [
1. 直接调用 vector inner_product 247s
* F! q# U" ]5 Q( Q" Q2. vector 循环点乘累加 237s8 W, M+ H+ Q9 t5 F" I! {5 ^3 M5 l
3. float * 循环点乘累加 204s
3 j) q- P" v8 q3 Z- k# c4. 空循环 100000 次 202s7 \ A, m, ]* C" g' T; U) k* S
# I# D* J$ S: \4 a2 }% Y0 c* N
不做内循环 200s
7 L3 }4 U% t: A l; c0 O' j7 T, l( {+ R2 L: W& A% i; M! e
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
5 p6 l% U. i6 R" T, n0 y( }$ N另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
, Y. w8 Q3 N0 h
2 P+ m2 E: M5 d至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
' p" ?# a" z6 q: O/ J7 ^6 m7 i( ~* `1 v9 p$ {
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)) Z0 s) P- [+ j* U8 `! L8 ` \
, v3 X8 v7 O0 h2 }; u
std::vector < float > vec1(N);
: W5 w& L1 m0 A' } B. \, Q1 B std::vector < float > vec2(N);- a' F0 I! I# T( C1 a: o0 l
float* b1 = new float[N];
$ z6 d0 b" |& @) d0 K+ S; g float* b2 = new float[N];' _& Q# k3 Z% w" N
8 `5 r v- t3 k7 E5 ]8 o o for (int j = 0; j < 6000; j++)
$ g2 Y% M3 i( X7 ^; @" [0 o {
/ |& F9 t6 P/ |2 z/ q3 v std::generate(vec1.begin(), vec1.end(), []() {9 m0 }, ~7 c, {7 ?% R( d8 A% F
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
; G6 z4 g5 N( S0 H });
1 x( x) W F! o+ L. P6 E, \
8 w3 s- Y% E2 P std::generate(vec2.begin(), vec2.end(), []() {
1 X: Z B: H; y, F3 G0 R5 { return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
' m' R4 J" R- e });+ A3 V, \# g& j9 O# K
; i+ |" I$ o# v; ^* O for (size_t jj = 0; jj < vec1.size(); jj++)# [! {! L3 m Q* r/ r
{
8 h- ?( X/ M8 j8 s. ] L b1[jj] = vec1[jj];, E* a5 J$ n3 H& n
}
2 ` \9 Y$ X7 e/ Z) P* i
$ u, _' r E, M1 W6 R for (size_t jj = 0; jj < vec2.size(); jj++)
6 w2 n2 u. W; Z/ q* k {
7 ]+ U7 ?9 }9 R- x" |& R% x% d5 A b2[jj] = vec2[jj];
, u, d' l3 ~& f `% { }
0 C8 _3 n1 c/ g5 T' R; V+ U: [. S+ h9 B' S
//Method - 1 N=100000 247s
( D/ K4 M- s$ l! C4 R$ [ P //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
3 m5 l+ K% D( W3 L. [. n' c
: i, @4 p; S b$ | //Method - 2 N=100000 237s
' o& k! p9 ^, c E% c /*! i! Y4 Y" ~* \5 V4 w, Q
for (int jj = 0; jj < N ; jj++)2 `$ @ l g. J3 L! x& D- V
{% u- V. S, c X! q
fresult += vec1[jj] * vec2[jj];
+ P, @, n5 Q9 s6 f6 Z/ P }
5 f7 ^$ @8 x9 F& c */
; e' {: r9 i# L) Q7 Z; z5 t9 } 0 A5 P K" u8 m
//Method - 3 N=100000 204s; K/ O0 g7 s1 M3 W! ~
/*, a) c# }& p; ^8 C, ]# Z" }
for (int jj = 0; jj < N; jj++)
* T+ q K U0 S# N6 H# o! d& C {
; q N# \: G) ?* i. b/ }# C6 x: N fresult += b1[jj] * b2[jj];
) X: h3 Z% l5 R }
! l- p$ x/ T" u8 l */& y: B8 C2 [3 q2 M
& y: U+ ]5 f m //Method - 4 202s ~! H1 }* H# X. a
/*
, D4 H1 [- J# o$ f for (int jj = 0; jj < N; jj++)
+ O7 N6 L: j5 T1 P: G. b- z {
* [+ c" u! Q3 J$ F3 Q8 g8 ]5 {+ ^, O 2 l9 m' Q9 ^7 Y+ U) L
}8 t( ]4 ^1 o1 r) N$ b
*/
- i& N. S6 V+ P" d7 ? //comment out all methods, N=100000 202s - F. T+ T7 j1 H, F7 K# D
}/ L3 r5 d; s! ]3 U( U
# C3 I. p5 c- C# i
delete []b1;$ n( Z1 {# X7 B, Q
delete []b2;
& H9 A% |' Y1 k. J |
|