TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - t, M6 S+ F e" q& f" P
- E! e' r7 m& j& f理了理思路,重新做了一个测试。
: }0 w4 |: U# u3 T* z* l. T! L做了两个 vector 和 两个 float *, 都长 100000
3 }2 B3 m+ V+ e& J外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
" B( I7 J$ q' ]1 |
0 V% v Y% f9 p! O1 G内循环试了4种方法,; F+ ~* X H, S5 G |! S; `
1. 直接调用 vector inner_product 247s
5 e" X% H3 \: e5 _2 d2. vector 循环点乘累加 237s
9 s/ p9 P8 V- H3. float * 循环点乘累加 204s
2 M, y! J+ p/ f7 J7 B% ]9 m3 F4. 空循环 100000 次 202s" {4 c. C- H& u! H( P
5 X+ ?: f7 m4 c' j9 i$ q0 \- ~" K/ [
不做内循环 200s
; h8 D7 _& D+ G- e" w( J M3 j2 d* E7 I$ C H* f
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
1 @# D: A8 O. N3 X/ J$ {2 z$ I另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 g' w' O7 k7 C$ j. {
; ~! U9 X- B' N$ O! \至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
7 i3 T$ p5 e. y. K6 g3 B/ Q$ i# T$ a2 |; V6 ~" P# r2 Y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
0 e( F* i+ W8 e4 \! n; \0 B# C% v6 K& R1 P9 m, s
std::vector < float > vec1(N);
- P8 g: b5 Q) S6 s2 ^ std::vector < float > vec2(N);4 d& l7 X6 r; L. f6 Y
float* b1 = new float[N];. |0 b4 z. F! ?- S
float* b2 = new float[N];6 _9 k. O' D" b3 q
5 v4 t$ M( k6 L E( A) y
for (int j = 0; j < 6000; j++)
- P# {6 Z& M' ]3 _1 U( o {2 }; X& {4 f% F3 o0 N
std::generate(vec1.begin(), vec1.end(), []() {
/ v% K9 z( Y" C& a X; t return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
# B6 b6 F* ^; T1 t });5 Q" I% F- P9 r9 H/ y
6 N. y& ~4 y- }
std::generate(vec2.begin(), vec2.end(), []() {& E' Q$ s" s/ ]- Y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
' K: M$ Y9 ?; Y* {( g; I });
1 N- X9 q1 w, K+ y" [, Z7 C+ j
0 ^9 R+ T5 Z, S* h4 Y# H9 S) j0 d for (size_t jj = 0; jj < vec1.size(); jj++)* P6 O4 ?0 K+ U" Q( F) i: W
{" N( M/ P/ K: p6 p% C
b1[jj] = vec1[jj];
9 r* T" Y* K* @ }, h8 w% p7 n8 L
' y* @$ H5 } M) J
for (size_t jj = 0; jj < vec2.size(); jj++)% d c: R. E" M' R* C
{
! M% z4 Y, }) R2 C! ~ b2[jj] = vec2[jj];
* @' O$ F" K4 ]2 ^) B6 E- r }
+ v" e3 [0 K' t% }3 Y# N1 S# u" k% R& S7 h
//Method - 1 N=100000 247s ! v \6 n' N7 x- F3 \! ?
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);) l" E9 u* I. C: ]& H8 c H
3 y8 @1 |$ g! O. R) c
//Method - 2 N=100000 237s# U, k, `5 L3 Z& ?, l- G+ O# C( R
/*, U% o4 y% t( d8 ?! Z: p' |7 }( b- H
for (int jj = 0; jj < N ; jj++)8 v6 F% r6 X' R6 H/ \
{
) Y. m0 f! k/ T! l fresult += vec1[jj] * vec2[jj];/ {$ `. G7 N% \, ]0 ~ \
}
: C- r4 w% m/ G+ K6 s */ \5 H6 y$ R# O
Q; a0 o; Q G2 } \# a0 p
//Method - 3 N=100000 204s% Q, _; d/ a" c- `
/*! v3 ^2 ~9 j% s) f- W- s
for (int jj = 0; jj < N; jj++)
}; y9 G: [0 k t' P! o! r {- \4 a' k! `8 L- V; K
fresult += b1[jj] * b2[jj];
2 R4 s0 m0 B; p. M( Y9 b9 P) C) K }
" W" u" F( q3 w# ]% { */
6 Q4 R/ O' w/ ~; e1 a! U( r% I1 ?2 ~3 ]* C7 f7 o5 B8 m
//Method - 4 202s
) F2 d8 ~( f8 [0 y$ m9 K' R3 ~ /*
, Q% g7 S) A3 \; V6 T) y for (int jj = 0; jj < N; jj++)9 t5 w* R/ O/ W) N- x
{
) _* W# u, m; r) r
4 n4 `1 v& A/ C7 ^" { }
' e7 Q2 P2 M3 G1 K */7 T2 w# U3 c& }' s
//comment out all methods, N=100000 202s ! t1 J; V3 F4 A. j; E
}
+ R! Y+ l2 P5 x2 f! B' z* N' e1 L9 L1 @3 Z; G& i! g
delete []b1;
" e2 @( Q, o) }4 a; E! I5 L delete []b2;
/ H# E5 B' K6 ]5 I |
|