TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
% Y1 D8 k$ n- O; n9 u0 ^0 `7 `0 }. V
) J' ?* r/ d* a7 A, u; p理了理思路,重新做了一个测试。
" {( C; ?' v; C8 O- ^. e: ~( z做了两个 vector 和 两个 float *, 都长 100000
' v' r h; q# y" }% s外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 d4 j) n( y6 r0 ~3 R
3 Y3 V+ p [- U1 N3 ~$ T内循环试了4种方法,
' ]% P' ^/ S+ u9 X3 Q' Y1. 直接调用 vector inner_product 247s
, O( ~9 W; @$ G n2. vector 循环点乘累加 237s0 l9 }3 C8 s: f# v
3. float * 循环点乘累加 204s( G; [4 E1 w) U$ W# _: n5 w
4. 空循环 100000 次 202s
" n$ }- n/ |8 A, |& O! a8 C2 Q' e
6 k3 U/ z% t1 F不做内循环 200s9 [6 l+ m3 \% r: `" P: g7 ~! @
' ~( [" h. l' X5 ?你昨天说的对,内循环本身占比是很小的,大头在其他处理。
/ b. A% x0 k! @% K- n ^另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) ~8 o& |5 v4 X1 F, _5 G4 o
% u O: U' D7 l9 H; z
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
, H" m' |: l* i# ^" E1 w; ?5 b' ~' M% M) ?' E% H# {
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 ~- M! l$ _! [) z! E) s) m( f2 \2 Q5 Q
std::vector < float > vec1(N); f' c7 j# ~) M( y
std::vector < float > vec2(N);
8 o, x3 v5 D" { float* b1 = new float[N];0 S! y8 T2 a" \8 R/ e
float* b2 = new float[N];
) O. R/ H. v& V4 ~( e9 M/ t9 n0 @& b6 ^3 I) F
for (int j = 0; j < 6000; j++)$ Q9 b7 L! `% Z# J0 H. _' ^2 p
{
- y* h' b- U2 g# r std::generate(vec1.begin(), vec1.end(), []() {" O+ B( W7 @ |" x& a" r! m# y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
) P$ E" o8 e3 G/ K9 q });# j3 u# X& v0 E1 \0 x
5 A6 J$ P) c V4 Y% {
std::generate(vec2.begin(), vec2.end(), []() {; a% A" R4 [( v5 G+ `5 a/ T
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
) @+ ~; `6 R( m. N });
; }7 L# q, M# M5 \ N u6 J
4 A; j% O' y) }, ~, [) d for (size_t jj = 0; jj < vec1.size(); jj++)
$ t( Q$ s2 O9 v+ h {! ?2 S9 [, @7 D
b1[jj] = vec1[jj];5 i- x" N4 T: q" h" O1 M
}
2 D5 ?! Z1 v& e Z1 b& ^
; D$ s9 H! q* R! } for (size_t jj = 0; jj < vec2.size(); jj++)% j( L5 s+ C2 I
{
" A' Z0 d9 q, X0 a+ r6 q8 o b2[jj] = vec2[jj]; U) { H( w0 u9 ~& s: |
}
; E# n- A! b, Z: D7 t! ?4 z' I2 p" ]1 c" o* g
//Method - 1 N=100000 247s 2 h7 t- D# p9 u3 ]
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
* Q# E1 Q* y' b9 }" G
+ y: v+ m9 x( t* s: E! S: M //Method - 2 N=100000 237s7 s* t, o7 t3 t% ^* O
/*
7 i. E: ]& ]0 J6 p( o- V1 ?# V for (int jj = 0; jj < N ; jj++)
8 ?! H* K* t3 E% K {
/ q7 O: v3 | D* t6 a1 o- n7 R fresult += vec1[jj] * vec2[jj];
! [# b3 a7 ^% Y f+ W }1 R& v8 y! l; x! M
*/
6 c. ^8 A' A' h7 u" F
- G3 H. L; }! O# u6 v9 I //Method - 3 N=100000 204s
1 F. g6 `1 T: t8 Q /*# ^& Z% r6 z8 W9 q" ~
for (int jj = 0; jj < N; jj++)
; R% J# ^5 t- _. y: n* ` {; t7 M: h. O5 K) d5 @8 E$ w0 C
fresult += b1[jj] * b2[jj];
. b! j) o7 X9 Q# p/ c }1 t; [" k, a3 s$ s2 B
*/
1 N* z5 f$ c1 l9 p" Q3 p d2 Y8 Y/ @5 L9 {
//Method - 4 202s) e+ W7 W1 g* r! I( i$ V& I H' @) E
/*
: @5 t# n% l$ L$ o1 n, f& w for (int jj = 0; jj < N; jj++)
+ P' l `$ W+ g8 d( g. I {
7 X0 k4 U: w6 k3 c7 v7 ~! a) m+ s
9 y$ g4 C" u9 ^* e# [& [+ O }) j" v, Z9 t6 w) V2 o
*/
/ `% h+ f- `7 b F& C: i //comment out all methods, N=100000 202s % h- s% H9 P5 Q7 E i
}
" e& x- k- r9 d& x7 A4 D
- c# n: p) N; H: r9 [( i delete []b1;3 H s4 {6 O' O; X Q: G
delete []b2; 8 k7 L8 ]% B' u! W7 G1 O
|
|