TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! y. f* L% ^: r" }+ W
+ O' X9 Y1 Y7 d; E9 G7 B" ^5 _理了理思路,重新做了一个测试。
8 l1 |) M* E7 p$ ?! N做了两个 vector 和 两个 float *, 都长 100000
( G) y3 H3 y9 J! j K+ y# H B外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
$ A& R6 y! ?' C, ?
) g; H& @, D+ Q) v2 W$ {- Z" N3 G4 ~, ]内循环试了4种方法,
, [3 {# g8 J( U+ |1. 直接调用 vector inner_product 247s
8 Q9 O" a. J8 J2 T3 v2. vector 循环点乘累加 237s* J# v) r4 x! U% h1 J9 u% [
3. float * 循环点乘累加 204s
- H0 b/ o% @( \1 e4 ~4. 空循环 100000 次 202s
, R6 @3 V4 p4 |' R% M, h+ ^0 u3 T5 ~& W7 R* B- k
不做内循环 200s" o" J' t2 R$ Y4 C, v& H9 @
* t: V h8 ?" j4 u0 `0 q& g
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
% y; G8 m- ?# {; {% M' P& _. }0 z7 [0 C另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
( s! { n! m2 D1 v
& W9 O. P1 ^/ e至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
! j; D; [9 k4 z- t
0 z" S9 [% }; [* Q. J(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)2 ?) ~( @( `0 a3 C/ `, s5 x* A
: ^$ d/ m$ B% Y2 z
std::vector < float > vec1(N);
' `7 e1 J% q) c k& w& d. _ std::vector < float > vec2(N);0 a. K- w7 d. K0 U+ }0 j
float* b1 = new float[N];
5 @# C% c+ E ~ N8 L) |# P float* b2 = new float[N];; ?0 o1 w) @, D3 B8 p2 Z4 \; T2 G
& l: H( o( o5 \' `, w9 z5 Q% R% p
for (int j = 0; j < 6000; j++), ?$ f" ]6 d1 o9 Q& J7 d
{
' S9 ]8 Z! {; z$ t* [6 p std::generate(vec1.begin(), vec1.end(), []() {
0 g2 D7 L9 L8 b return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ H9 Z6 R% g1 b0 U5 }9 T
});6 K( l& x0 l* S2 g5 W
) s; K$ |) ]! u# W3 T5 F( t std::generate(vec2.begin(), vec2.end(), []() {
( {1 {- `& q A9 F return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;" V& E! @" Y0 s' v
});
+ e1 ?5 m) j5 L2 V8 ?9 V' p/ D1 d. }6 r6 g: x. q
for (size_t jj = 0; jj < vec1.size(); jj++)
- M; T# e. j' J/ Q% f- ]! | {
; F$ }/ [) ~ Y1 q9 T* ?% H b1[jj] = vec1[jj];1 q5 }$ y3 O1 ~
}
- v0 |3 k5 D: T, k% F% D0 S! i) T" \( C2 ~# \7 |( M" `
for (size_t jj = 0; jj < vec2.size(); jj++)
; P9 ]* r: x* G, k; I {
% Y/ u: E1 ~1 x4 |+ Y2 v ^' m b2[jj] = vec2[jj];
' o) V( O' x/ M1 }* c* X- L }
7 o& |9 {+ v+ @' D
9 E4 W: s' Q2 D F: {$ [ //Method - 1 N=100000 247s 4 \ _$ ]* z: m. u* o. f
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ c0 `, n; _+ |0 P& I9 R! w8 G
2 i! [) w* z& N" V/ g ~' S$ @
//Method - 2 N=100000 237s
9 }6 V2 ~# i. p9 `/ J /*) p7 R: i8 C0 r& @( o9 B
for (int jj = 0; jj < N ; jj++)
4 E, ]# g, }9 S3 E" d8 J% i) Q {
6 m2 E5 H0 P: l: D fresult += vec1[jj] * vec2[jj];
; |) Q9 Q3 U6 J# ?- V }) V0 H" @ ]7 A: _
*/
. _" [0 c9 w3 g ; o; x2 r. t$ O- _
//Method - 3 N=100000 204s% ~! F; d: L# G) x; y0 o: V7 f
/*% q& }# z B' ~0 g5 B
for (int jj = 0; jj < N; jj++)5 K$ ?) x7 i! f [& R: r
{
* j7 F% |6 |% F; u$ {2 O! b: D fresult += b1[jj] * b2[jj];
8 |5 p. I# _' M: g }8 a3 P: x/ m$ G. n4 Y T
*/1 x8 v) C& S8 J4 P/ R9 k
( H: v1 ^2 b8 a/ m+ \7 n
//Method - 4 202s
" p7 [4 j2 p, ?0 J/ N /*
: l: e* V: Q+ |% r8 r for (int jj = 0; jj < N; jj++)
; H1 k: K+ i% O2 r' W! Z6 C, N {
8 r9 r! o$ ~! g+ P3 l$ k6 ? z9 n
) m1 d5 H5 ~( P: |! C' c" W }3 H! C/ ^. P9 x4 Z9 U/ o* ], Z2 \
*/
9 R0 b8 [, U7 O q4 P K' c7 ` //comment out all methods, N=100000 202s 6 u& c0 l/ |$ ~, y
}8 Q$ R7 x- g) P; Y8 v9 {$ A1 k
, i: x- N" s, o" G9 d. { delete []b1;
2 `. q& ~4 ?% Y B delete []b2; " a% e9 n* O1 l" b: u! @; s
|
|