TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 * ?# a. H2 s! a& s% P- E
3 t) r6 j5 `0 o/ S7 k理了理思路,重新做了一个测试。 | h0 ]' j& b/ m1 u& {
做了两个 vector 和 两个 float *, 都长 1000009 M& D) g- p2 I$ V$ m$ u" ]
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
& I3 Q# z, H- }1 T" E7 Q/ K# D U5 s' b' o# T( G
内循环试了4种方法,4 w2 L5 s/ d( o2 g- Y
1. 直接调用 vector inner_product 247s
, i. }. p, K* p: e% g2. vector 循环点乘累加 237s
9 F& X8 B* w- I0 n- E3. float * 循环点乘累加 204s
- b3 z: n& l- {' H2 m0 W4. 空循环 100000 次 202s) D/ O6 w/ N9 C! A+ z& `5 T& ]
3 Z0 S! C4 y, P) [不做内循环 200s* |& {0 i$ j3 H8 O: ^8 f
1 f7 A- w1 Q/ P& ]3 y
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
4 l; g3 m6 c `* c y另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
% X4 ^9 [0 j, v" T( U) {3 P6 f, c# i/ D8 [' Z; V# B
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
0 h; U; X8 I5 M5 m, P y* J& P( U2 R
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)7 k' ]8 c$ t: d; M9 ^* i
- ]/ ?% {3 H3 J- U std::vector < float > vec1(N);* W# j3 z7 f4 Z6 d/ \
std::vector < float > vec2(N);" b a; T% y+ Z. b
float* b1 = new float[N];4 c9 I9 O ?1 C9 v
float* b2 = new float[N];
; n" B- {& d- f# [' g; \# a V+ _; Z# y4 m$ x/ ^
for (int j = 0; j < 6000; j++)
$ c. X7 }& ?5 A( u7 g' N) z {
5 k" }) I. F& d8 I+ ?! C1 }" ~. D! P std::generate(vec1.begin(), vec1.end(), []() {
7 e' e Q( R$ z/ G$ H5 _ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
" I* Z1 b* y3 k });$ C; V8 E/ s2 n/ {3 E
7 M# T. |2 M5 K c# [
std::generate(vec2.begin(), vec2.end(), []() {
4 K/ c2 D, B+ [# t# A return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
$ l/ W4 E1 W# N });- `! M' S# O6 W4 J
6 D9 V9 e$ A6 L4 D( P+ h
for (size_t jj = 0; jj < vec1.size(); jj++)
, L& z5 V; ]& r% L9 U, Q6 I {
8 j9 k4 ^# O( W2 G7 k b1[jj] = vec1[jj];# B% H S2 E9 _; L& u* o6 v. D4 S/ Z
}* `% ?$ M; O+ c* S* ^
! ?0 W5 O0 X* G0 L6 B! w
for (size_t jj = 0; jj < vec2.size(); jj++)
* K& w8 J: v y: O5 O6 c {( P" k5 G- `8 J; v
b2[jj] = vec2[jj];
' @1 }% t" }( r; U }. }# u1 ]% J3 g3 w# l1 n% f8 n
; k, [* p( y, R r5 b( I! m0 p+ m7 \- @ //Method - 1 N=100000 247s
' n. G K4 B5 P3 c0 |! { //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
: x( u2 s9 u3 a7 p( W
2 a. e6 P. s1 k1 n! p! {& [" M //Method - 2 N=100000 237s
/ t* \: |$ d5 A9 f; U) ~3 A) e /*
) d; b7 C- U5 y- @- u for (int jj = 0; jj < N ; jj++)
& o; a% y3 O/ R6 j* J4 h {7 `; l3 W4 y! S: t: n
fresult += vec1[jj] * vec2[jj];+ Z% Y& ]. M4 |2 m0 H
}3 A4 o+ J$ I* w7 A$ {# d7 h8 S7 q G5 a
*/
7 y" L* p- Q: s
5 S' `7 Z3 s% r //Method - 3 N=100000 204s! L% Z7 `) u+ Q: }+ K
/*/ s" v; r" |. q+ ^$ [7 P3 C
for (int jj = 0; jj < N; jj++)
! P0 E: y0 S: Z. v* v$ C* U' F3 o {
) t- X. n( } b1 M' f0 b5 M fresult += b1[jj] * b2[jj];
2 [ l; X" Q" ^# ] }7 [* G u. y. [1 L1 z
*/& T6 t2 I' s, n8 S8 S
. z1 q# w% V" p$ C //Method - 4 202s8 s6 w0 b+ e' H( j
/*
" u# f" J! C0 L& y8 V- w4 o! a1 { for (int jj = 0; jj < N; jj++)
) O% U! e0 S9 P) [* H$ m {
; H& e% w- R, s; b9 e" T% B7 Z " Z- `7 V& a6 i+ `
}
' r3 X( S1 \$ H+ {! q1 U */0 K& n: n6 @) `1 W( c9 L
//comment out all methods, N=100000 202s
. }! ]* c: g" n0 ~+ N& a+ ?- S }# }7 `& g9 k5 S7 z$ C
2 u' u! W$ \' T' V9 k) ~* k2 J delete []b1;
' w/ `7 m& s* {1 e# z+ x delete []b2; 5 S% f# i0 H+ ], O- g! @ }/ y
|
|