TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 , B& f( Y9 y {& h9 @
9 z: Z: j5 b, S X: P; E理了理思路,重新做了一个测试。
t+ `' [7 f( g+ k" R5 N做了两个 vector 和 两个 float *, 都长 100000
) ]% k& n* N7 a+ f+ `外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.5 G2 G6 d8 g% L4 \
8 x3 u* R. `& `8 c
内循环试了4种方法,
7 x! {/ ^8 \' Y% C# V. b- F1. 直接调用 vector inner_product 247s . F' b$ a$ [, X8 }
2. vector 循环点乘累加 237s; ~ Y$ I( O- v
3. float * 循环点乘累加 204s
- i' H3 u s' E4. 空循环 100000 次 202s
3 ^4 G/ R8 h, H8 A( W* R: M2 E5 b3 d4 d& r
不做内循环 200s/ D# `9 M% v- D( t! t, E0 @5 C
5 a" Z; n7 t9 x$ Y& p' H! L
你昨天说的对,内循环本身占比是很小的,大头在其他处理。* O" e e* }/ n5 f
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。. T$ }2 {. H' d2 o# d r8 x
V5 [+ T, b) ~2 G
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
5 E0 D h5 S8 e0 g1 F+ S2 M1 e
- g- ~) R$ Z$ P; u6 ?" x# Z(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
5 A( w" [4 T* a/ q! z5 g4 V9 a% @- @, \- B4 [
std::vector < float > vec1(N);
2 M% o, {6 v# ^' n. c& \- M Z std::vector < float > vec2(N);
: p6 J$ W: d$ I$ u- G float* b1 = new float[N];3 z* ~- p! V3 q9 M; d
float* b2 = new float[N];
0 t: D; }2 `1 U- A3 R4 h2 S1 p0 U+ S& L% q
for (int j = 0; j < 6000; j++)
" B# i, c9 |0 Z% C# R8 j1 L3 G5 O {- J5 a+ U& {3 G
std::generate(vec1.begin(), vec1.end(), []() {
' |4 a# j9 i8 B$ R: n# J& v return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;3 N6 _" O$ m S! E( E
});5 ?! d/ f. N& n( X
( |. W8 ^+ Y9 d G* `( i6 V- L std::generate(vec2.begin(), vec2.end(), []() {$ H, V. A; Z: K7 F+ b3 f/ l
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;. G0 n% b. b4 g8 T
});
: P4 N5 y6 R; N+ V* Y! Y
/ K9 `3 s( I2 ?( z' E9 t' M Z for (size_t jj = 0; jj < vec1.size(); jj++)( o' h# b- T5 e: s: R
{3 X6 {- \( U# \! N
b1[jj] = vec1[jj];2 T$ p, I# D* }3 H: [
}
; w9 r& u1 c, L/ U B* M& C1 u9 C: `- t/ R; t5 ]. E" W
for (size_t jj = 0; jj < vec2.size(); jj++)
" A' f7 z! p) C* n {
. ~/ N: s( O+ e9 u K: ]3 i+ l b2[jj] = vec2[jj];* x' y0 B, d+ H. V# P2 J7 [
}
1 @3 Q7 A: M0 B! o
! X4 r8 v% R \6 i( j3 N- ?$ F: @) E" R //Method - 1 N=100000 247s 4 f* A$ j# l9 b5 a6 q
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ S" G+ u' S0 ]) R5 j : u& |% L1 A& h. P2 B0 Y- o) X
//Method - 2 N=100000 237s
: p/ F: c5 F6 r /*
[ A$ D9 b- `6 m8 ^9 ]; G: s for (int jj = 0; jj < N ; jj++)
& x# H* O! d' q- `3 Z4 V {
7 N5 O' B3 j3 m( m; p& H u fresult += vec1[jj] * vec2[jj];
, F; P* N9 K* b" g9 a$ k& d }. U9 v% j( }- |
*/( z- k' B6 W! a4 h+ a
: I; |1 k2 v3 o% | //Method - 3 N=100000 204s* O5 R0 n0 k# v7 V) j% v9 A8 i* [
/*
1 l7 C0 k, ]' h2 g. @6 m for (int jj = 0; jj < N; jj++)
1 H6 ] ]" @, @5 A {. P9 H( F0 o9 k4 _9 B
fresult += b1[jj] * b2[jj];
% |1 v) P# Y; E, |; @ }! ?/ G! n6 {) v; D1 b
*/
: U% V$ I1 i3 a% A2 k. z2 y) D! l- k* T7 \0 x5 U) v# ~
//Method - 4 202s
# f/ \( l3 |4 Y" j6 {( c) e /*
: n0 U v( m! N4 ` for (int jj = 0; jj < N; jj++)7 s% a4 V' h2 _) @' e6 e+ r5 [
{
% L9 z) ~) h7 q- J6 e, S- P. Z3 N" L! } ( I2 F2 X. P/ S6 r
}0 A. J: s# Z: T5 u- {( }
*/
/ O/ |! n6 U/ q4 u4 n8 \ //comment out all methods, N=100000 202s . X s% `. R# B f; k! B
}
0 j2 Z* r( w; N- [) z1 {
! P: B I2 a4 O& z1 R delete []b1;5 A7 t- c' ^% y, {
delete []b2;
! h9 @* U, E. W |
|