TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
4 e. h9 A9 V$ j, b A5 V
% M5 C) x! p" S! L* a; p理了理思路,重新做了一个测试。+ @; B) B/ |2 s- l" a1 P
做了两个 vector 和 两个 float *, 都长 100000
) N# V/ K% k, g K% Q外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
, n/ T0 P; l9 ~4 j+ j- O" _5 t5 @" {1 O
内循环试了4种方法,; ~3 z# ?( G/ [$ o- n. b. T
1. 直接调用 vector inner_product 247s 5 K: ]3 V* ^. A/ R- g S, |
2. vector 循环点乘累加 237s
% J) N1 @& h+ x& ?9 X: D3. float * 循环点乘累加 204s1 s8 t4 N n* J$ v9 Y
4. 空循环 100000 次 202s* o# G! P4 K4 i, c1 \$ G. k
$ b/ D" u7 {8 r, ?不做内循环 200s; Z9 t" F& w z: D
. _! u7 B9 R5 t' {# K# b" b5 A
你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 ?+ n0 t, [ `& ~8 y6 d3 |
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! {( c9 i$ f4 J- D
9 A# W& ^. e' M9 F) f
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
, S b0 v+ i8 v4 v
( X; d5 o. |4 d$ n, \: c1 y+ \# z(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL) S) t0 B1 Q& Z! ~1 J2 Y- Z( q
2 `, n4 Y6 |2 E std::vector < float > vec1(N);
8 h7 o" X; q* l std::vector < float > vec2(N);
. x5 H; X H* r7 Q. h float* b1 = new float[N];" L; x: R& }% m+ j' \
float* b2 = new float[N];9 O" V' D# l9 ^& O
1 ]% o) ]" \0 ?) H( u4 G9 o
for (int j = 0; j < 6000; j++)5 y. L+ M F4 v7 L
{
; i# n% w" [" J& z* U j/ { std::generate(vec1.begin(), vec1.end(), []() {" z3 X ]" @/ P2 q L4 R
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
+ {0 B C+ g9 |6 p });
$ d' x4 C- V! L# r1 G2 E1 C& j$ f2 ]9 j' n7 p! l
std::generate(vec2.begin(), vec2.end(), []() {
& u$ E- U$ I! e9 s- w1 G return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
U* i( p, W" b) [ [5 x7 ? });9 G6 g ]2 X4 |' {
3 B* I9 d# `' ?2 ^ for (size_t jj = 0; jj < vec1.size(); jj++)
( _% {4 N @! x" G0 n$ t. ?! b, T { A, E' W) g( Z; b' N2 j+ W
b1[jj] = vec1[jj];( K$ c' H [9 v( u, |2 h
}% c! K: n8 W3 K+ Q
- j5 H4 t; u1 ]6 E R P2 | for (size_t jj = 0; jj < vec2.size(); jj++)$ v$ C) v( U. A+ Q
{
! M: `) u- S: R/ {% c5 Z b2[jj] = vec2[jj];
% y3 [8 W6 s+ i0 Z. P }
+ |0 w& r+ b* Y* S" S
4 D+ }6 W# N4 |; Q6 l0 L# o- k //Method - 1 N=100000 247s . f' h) A" T# L$ ?$ L) j
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
4 e7 r" F& S! S# ?+ N0 m, h, k ! n8 j' q4 a9 Z3 }' g/ l
//Method - 2 N=100000 237s
l5 p2 Z" V8 [8 D1 R: x3 z6 X /*
3 r# E+ c' S+ X% v: w. y for (int jj = 0; jj < N ; jj++)
" |1 ^8 W# |' A4 Y7 S {' J7 q' l; d! j) j
fresult += vec1[jj] * vec2[jj];$ L, M9 `$ D* N8 f% o; J4 U: p# s
}
) O1 `/ r9 M' B* | */0 |5 U3 b( g5 a3 i7 H, r1 K! Q
2 | E8 ^: j6 R( E3 P, q
//Method - 3 N=100000 204s
( G- P7 P9 }8 o- _5 O$ p% t /*
# t4 N. k: P5 O8 U% B for (int jj = 0; jj < N; jj++)
6 z! M; E& A. f' K: Q {( ^& o# n& r7 S% c
fresult += b1[jj] * b2[jj];0 C! b i! o/ \; y0 s/ A
}0 U4 e) ^6 ?, a7 a+ S6 c$ l
*/
, [+ p+ V. v: K2 B- y0 Y) _9 a/ C
+ d7 k; Q" D7 {; f7 a3 m //Method - 4 202s0 V2 D0 |. r. E2 K" Q
/*
/ ~7 t7 K% ?/ m) p( [6 { for (int jj = 0; jj < N; jj++)
: _) T4 I( x# l {
: q! d# v; S9 `& c6 P% \2 S
3 x) b K7 y/ K L- ]+ K }% F- i- G5 _' r! }! ]
*/
4 Z. `, l! {6 @2 K: O4 D' F //comment out all methods, N=100000 202s
2 l1 ~" j) I8 O }+ V- |& x' Y% ]8 d
! |% j5 A* N- `; t# a5 e delete []b1;
6 Y7 h4 Z \0 c" G2 X/ a2 P delete []b2; & {" N T4 J% m$ m8 A; M; c) W
|
|