TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
. l `0 i7 U+ G E! a3 \ ^, J( R* U$ \0 T# o- n) q2 R/ Q8 w
理了理思路,重新做了一个测试。8 J+ A: p! E# S( d4 T ^
做了两个 vector 和 两个 float *, 都长 1000007 e3 c% V2 k' f) _6 X0 V
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 X) x5 v! p) B* b. [
/ b2 b# r' d- l+ c" k内循环试了4种方法,
$ h; \- i# [$ U7 x1. 直接调用 vector inner_product 247s 0 `( c; E8 p6 T
2. vector 循环点乘累加 237s+ H3 H7 F3 Y1 ]- b. E/ A4 M1 Q9 ?
3. float * 循环点乘累加 204s
, T Q) y+ z, N% R7 l& Y4. 空循环 100000 次 202s
5 Z- M/ e# ~4 w) o' S4 u. i$ |2 A; @
不做内循环 200s
6 F/ Z9 [" G0 q. I" u- @& j) r9 U! l; E7 k, v. o
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ |2 L/ [# x: Q+ F! G另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
. K! F2 R) t. Q) {# l' _0 `3 g# A0 h4 B+ g1 S1 {2 P
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
" H3 E: Y% s* Q2 a h4 {/ \; i% s% @7 b. d: N5 Q3 D# I
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
% R! I+ Q' X7 X) J& f1 @; Y W i1 v
std::vector < float > vec1(N);9 T6 g4 Q4 y# @5 N' s
std::vector < float > vec2(N);
+ e+ B2 V" Q3 k float* b1 = new float[N];
6 ?4 K* y/ k. R$ R# }4 D/ T9 Q float* b2 = new float[N];( q2 k* |9 @7 Z3 s, c+ f
' D) @; H* x R$ w+ T) U, y+ X- D
for (int j = 0; j < 6000; j++)5 J8 S+ ?; L$ D' R: P: s* F
{
+ o8 e# w5 y! U6 l+ j& s' S& ` std::generate(vec1.begin(), vec1.end(), []() {
$ }/ Y& U/ S% z2 Q- b return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
5 N9 I' K$ G) f# b) m: } });
2 ]7 S' P' R4 v- H. M5 W& f% e! p0 h
std::generate(vec2.begin(), vec2.end(), []() {
4 B9 U2 E4 B% M( b8 }0 d/ [ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 k( H) S( U$ c- a
});
. V! M8 N( ]# T3 [( N2 B/ Q
3 i, W9 q4 F! C for (size_t jj = 0; jj < vec1.size(); jj++)
2 A [/ `8 v8 n& g7 D) b) {" \3 H {* }% O5 E8 i) Q7 c( k" V# c& B. P
b1[jj] = vec1[jj];! \- W. E1 Z3 v u7 P
}; \, G2 C$ `: Q7 U, T7 u
5 k$ P7 ~4 s8 r5 w; }1 t4 ` for (size_t jj = 0; jj < vec2.size(); jj++)
5 F) ]/ U" ?' F. L6 q1 D {
8 A- K$ [+ ?$ N. z b2[jj] = vec2[jj];
1 W4 O( d& L7 I& d0 G+ m }) y& n" x- T2 o9 w3 l/ g
5 p/ }% G7 _$ q6 b7 P. J //Method - 1 N=100000 247s 7 {, \( S2 ]" U: p* i5 w9 d+ ?
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);: { N4 D. B r, S
' m/ O7 ?$ k& _. S" `* K //Method - 2 N=100000 237s8 n4 L' w* C; B
/*" n; ]! X( G+ B, g) |% B. O; w4 A" i
for (int jj = 0; jj < N ; jj++)& h0 ]! ~$ W7 Q4 k4 H4 o
{
1 Q, }; e, S j# Y, U7 u1 r+ r fresult += vec1[jj] * vec2[jj];
/ z3 j5 H4 y* @$ F" O' I Q }
: m( k! {, l% ]# s */
0 l$ r7 l" P+ f1 |' ?/ f. \
3 w6 O9 Q1 M1 D2 ~" x) { //Method - 3 N=100000 204s
( O v1 Q* N: b$ j" c /*
" [, T* k. d2 \( [' L for (int jj = 0; jj < N; jj++)/ Q/ F; l7 c: Z3 t
{2 V5 i. y. l9 O
fresult += b1[jj] * b2[jj];4 X; D# ^+ |1 _' P
}# Z3 Q& l8 w8 o y$ |
*/
% v4 \. Z/ S) v& ^# P! y8 i8 e2 L/ I- f3 f& M0 J( c3 h
//Method - 4 202s' t8 q7 `1 {# i
/*
( Y( P3 P& P4 X* u( _( I for (int jj = 0; jj < N; jj++) w) o- Z0 R$ D) B/ B
{; l* E" i2 V! h5 ?- h
5 Y& F4 Z, R: n6 P5 d) W; t7 l }" {+ H: S& T$ k" N/ `6 a( F/ p
*/( o0 d j; U! H P
//comment out all methods, N=100000 202s / U0 J: K6 H2 x, @
}4 M3 X8 b" P$ o. [" S4 L
5 r- P2 v6 Y: |5 q$ y
delete []b1;- t! u+ F4 ~/ F0 X" v$ _
delete []b2;
1 \+ F- V8 d6 ?2 ]; I8 p* x |
|