TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 + A, I' D- |( k! Y) y
- G* t, ]; t: p. Y
理了理思路,重新做了一个测试。6 A& C$ `' v2 E0 ^* m$ F# g
做了两个 vector 和 两个 float *, 都长 100000: p9 @3 F$ M% T; R; v# b
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.) x! a$ y3 L: M9 V+ D {8 n
7 u8 q5 O% K9 j
内循环试了4种方法,
; Z7 K/ t5 Y" o" i$ P0 [1. 直接调用 vector inner_product 247s
1 T! I) y5 W1 E# d7 y/ @2. vector 循环点乘累加 237s
- D( `# l1 U x9 S: }# Y3. float * 循环点乘累加 204s
. Q# w3 o- {$ i( L o q4. 空循环 100000 次 202s
" Z5 u' e7 M ^3 V- |3 X
: I( v: E" }5 R不做内循环 200s
7 M$ f& x* n% l* G6 q5 [! c! r- M+ Z6 [: f% D) x/ Q/ i
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ R, n6 i+ k" W- c% T另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! U# q( P- @- ^! g
% J: P: l" W) T$ Z! W至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)1 t8 O2 i7 t0 g# n7 `5 K
" R& E2 } v$ X) J(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
5 q, Q1 c% t' Z- U7 {# |6 t: G9 [+ Z1 K2 u9 [. E3 n% @
std::vector < float > vec1(N);
+ B3 r. \$ p& n7 n4 u4 l& d std::vector < float > vec2(N);
6 Q2 j1 F/ z: Z8 M& T7 V6 v. C float* b1 = new float[N];
$ W5 j! L. d5 P) Y+ r( x! @& F8 t float* b2 = new float[N];. R& @& ?5 }3 X% a1 L" j+ X
2 M$ i& F) J J( @8 W9 D8 A7 Y# V for (int j = 0; j < 6000; j++)
) y9 a1 f: o8 ? {8 |$ f( ^. r+ k# Q
std::generate(vec1.begin(), vec1.end(), []() {
) D# \; |* Z, X' M+ T" Y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% q" H( k4 l- h+ ~; o( L) G
});) T4 a: @0 i/ ?# m2 o" W& x# @
% R0 L# M8 V% o. t5 W std::generate(vec2.begin(), vec2.end(), []() {
( w# U" n1 s) h8 g2 O' A# f2 r return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 a; x7 Q& h! h2 y2 _
});- n! A y7 B4 Z |1 ?
3 h" s/ g, G; c( d
for (size_t jj = 0; jj < vec1.size(); jj++)* |8 L7 ]3 `8 l+ w- V7 z% k% L
{
( L5 s' t6 x2 n8 u% M& }. P; ] b1[jj] = vec1[jj];
' W; [4 {# q# W* N, `" Y5 N }
' P( I* |, E3 D, Z0 b9 h" w7 [ z7 n2 u8 t2 X. g: a
for (size_t jj = 0; jj < vec2.size(); jj++)
% L8 _/ {+ c6 H {
( l6 _* D% N) o% _2 }5 ?2 _ b2[jj] = vec2[jj];
- t5 z u% \( [ }
$ J- q! ~! G9 j+ g8 K1 n) h7 Z2 y. v0 I( t
//Method - 1 N=100000 247s ) x+ A; _3 }7 M: A
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
2 l: B0 |5 t, b # d5 v$ j8 i' M* b0 R9 y( M8 o( e
//Method - 2 N=100000 237s
0 B- Y( U% D) t. C3 k2 w /*
0 T6 l7 n# V: o0 }% @8 Z! R for (int jj = 0; jj < N ; jj++)
. ~ q) q8 e/ |, S {* Y0 n2 m! f2 j3 \1 y
fresult += vec1[jj] * vec2[jj]; }7 |: t/ T, k. @& o% f, G4 w1 W
}
1 m5 \/ E- s; {3 A4 H */
8 x. f9 l4 q/ e8 V7 d* S6 l
7 {" B+ M$ Q' \6 Z M //Method - 3 N=100000 204s
* t( B, H7 }- W /*3 C) ^/ q$ z8 V% d
for (int jj = 0; jj < N; jj++)
% P( L5 G! p* H/ s# E {
* u. c/ @5 y% i fresult += b1[jj] * b2[jj];
0 w' w1 W0 S/ _) }4 ?3 p }- {! l* {# Z# p% j/ e9 O+ w/ ]
*/
# W, z8 ~ M0 t& W6 U1 T) E8 ]1 v3 S% ~0 N+ \
//Method - 4 202s: S" O* v' ^, i+ l
/*/ Y" H0 I- M7 Z; ]5 V0 t |! v
for (int jj = 0; jj < N; jj++)
" {1 \' F: ~; K0 I. K, d' \ {
* J) b1 d: o0 `, c
- _- T+ A A- g, r: Q- s }
( ]" q9 i" k) s& ^- @% l! \ */
& U6 ~ B& [1 N0 Q7 [" E //comment out all methods, N=100000 202s & s6 d" M5 K: O; z4 Z: v ?
}
% S9 M& h/ c: S" w# k' ]6 y, k, I/ M$ C
delete []b1;
( q# p [* V' T4 T! [* L% i; `: G" W) g delete []b2;
5 L; i9 K( f5 I* z0 s3 p1 | |
|