TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 & p; e# {3 ], i- a9 g! Q* V7 ^& P
3 v( `. X" Q8 V5 Y# {; R$ R. ?
理了理思路,重新做了一个测试。
% B) j$ j, `8 x0 w做了两个 vector 和 两个 float *, 都长 100000, Q" M/ _; v6 z K% f% C# D7 |
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
3 Y+ {" z2 ~- }8 k. `( L# V0 b; N" j
内循环试了4种方法,$ k0 w+ ~$ v8 q1 h
1. 直接调用 vector inner_product 247s 2 N8 Y6 u' T2 z: F$ I0 u' A2 N
2. vector 循环点乘累加 237s0 L: W8 Z. P [& a' L% w4 c
3. float * 循环点乘累加 204s
% h# o# U. v! a5 t6 R4. 空循环 100000 次 202s7 I% v4 q2 I7 T8 }3 K( y# j
. z- Q# ?' t- H, f* [: y6 B
不做内循环 200s
( W3 \5 q T/ d$ W' Q" ?0 e9 \
! [1 F' ^- ]$ G& ~6 h你昨天说的对,内循环本身占比是很小的,大头在其他处理。
% }4 I$ t; v, H( ]6 K& ]另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) c O. Y# F0 F' c0 [" z
/ n x# S% C" L$ f
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
' d9 a0 R" R7 ^6 b
1 B+ Z; `% @1 K. r) g(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)8 L1 C9 n% R2 U0 x
3 ?5 N) |: C( \/ B8 q std::vector < float > vec1(N);) X6 m6 ^; O1 G/ K, t& a' K% M
std::vector < float > vec2(N);* {0 P7 }9 k. L, u+ B
float* b1 = new float[N];0 w5 m! s: W, B. L# i6 ^0 r4 E! ^
float* b2 = new float[N];" `# T; M' x5 `/ `: d/ B
5 i { O2 q W) X
for (int j = 0; j < 6000; j++)" j" e9 z* M0 W& Z* R9 E
{( Q* ], F( `+ t }4 H, s
std::generate(vec1.begin(), vec1.end(), []() {$ k, G% n" r- A% ]
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 i) i K: o8 q/ ?) {
});* O0 t' z3 W: E0 C4 b+ l* C( y: C
3 ]! p9 K6 _' c0 M
std::generate(vec2.begin(), vec2.end(), []() {1 h: r& e2 z2 L3 B7 V7 X. T, }
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, ^5 G4 Q+ Z- o) |* J, R$ j
});
; d7 O. |6 _+ N9 K3 k
; Y6 E3 q: O- z for (size_t jj = 0; jj < vec1.size(); jj++)
* H* z4 Y: P% B3 ~ {* }: e8 E( I: }' s# M6 }
b1[jj] = vec1[jj];
8 s. |0 Z3 L9 ^0 e9 Y; k8 S8 A; l }- Y C- @/ G' x# v3 N1 ~/ X+ Z
/ R- P$ N$ Z: o% `* B- O for (size_t jj = 0; jj < vec2.size(); jj++)
5 j5 I; b" p7 h z& b0 y {
# m C7 Y! z$ Z+ B$ O6 P b2[jj] = vec2[jj];
4 t: E, P( y, f; i }
, w# d5 k/ Q$ ]6 u ]2 e3 e a6 Z% D: B* q0 {
//Method - 1 N=100000 247s ) w7 }, L# K# N ?' }5 a& O8 T
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ X: B. B) f( ^& H9 N/ @9 g; S / ?: Y% W- N; @( h1 D
//Method - 2 N=100000 237s
2 s* Y$ O2 U! z0 C /*
) [% M) f0 Q6 N5 m+ c+ a for (int jj = 0; jj < N ; jj++)
9 W6 |0 M- ?$ n4 ~* O! @7 [. N {5 V' g" Z( ~6 B: o1 G# ^
fresult += vec1[jj] * vec2[jj];8 f1 Q' j* F/ B
}
1 V: N3 G7 i8 U) Y$ C */
& @9 f, ^2 E" j9 w6 q' d
# I- R) Y' ?1 ?- B8 F* I. L; u //Method - 3 N=100000 204s
+ c% Z' Y7 F) n( I& c /*1 G) z8 I0 n+ X6 h1 M( Q
for (int jj = 0; jj < N; jj++)
' r( p0 [5 g6 l+ l: r) k {
, E0 Q6 K6 e8 _0 x: f/ p5 { fresult += b1[jj] * b2[jj];1 m& h" K$ _$ a p S& A
}2 q5 L+ Q4 O ~3 g; j! u w
*/
! D' y/ }/ {( i
5 q$ }' w3 g+ W //Method - 4 202s
# W& Q" {$ ^- W% C+ T /*
4 K: x( y% [ q+ q3 B6 x: r for (int jj = 0; jj < N; jj++)
* a, \7 p8 o- v2 b4 S! A {
( [) {0 H. J* F) n7 G! E* D
; R2 |2 o* M& j* ] }& T) [+ j. {% `; U0 W. |3 R
*/
& H* S/ m6 ]# k- s# h //comment out all methods, N=100000 202s
" e9 E% t- f- E0 ~ }
6 r9 C0 K' P, k$ T" R2 c
" u- Q6 X" D5 K# W+ @$ u2 C delete []b1;3 |- v) N2 G- N- Q. |
delete []b2;
- S( }# {* G* j |
|