TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
5 W, `1 i( p! f1 L
' u+ c: h% w5 a b& s- C! L理了理思路,重新做了一个测试。" x" r# B2 J2 s2 W6 h) _ V
做了两个 vector 和 两个 float *, 都长 100000
+ v6 y1 |7 A% s) [ \" p外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
6 R1 y% o. T; ?3 t+ r# ~+ o
% P, v0 k" d$ Z内循环试了4种方法,8 C# {" Y% U- C* Z- E0 n
1. 直接调用 vector inner_product 247s 6 z) i& |, N* |4 U' ~
2. vector 循环点乘累加 237s
, k4 D& ^) ^5 Y# {) ]% x3. float * 循环点乘累加 204s+ T; Z& W# J6 \8 l) P7 Z1 [
4. 空循环 100000 次 202s
% \" }. [* S( @, I ?! v M' H7 E7 i) h5 T0 {$ S& _4 D6 Q$ s
不做内循环 200s# y* d% v0 ?1 B% v$ n. f! j
; f, d6 u: m0 c8 @! O0 `
你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 l" @) v; ^. z, q/ s4 X' p' Y; j
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
; S$ l0 y+ _: b) i! l* S/ z
! V; l9 T% o+ r1 B, J至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试): ^, @; M; D$ x" ^# T( y
8 v; J$ |% X4 C' y' q( r, Y/ h
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)1 n/ z9 A% ~8 m0 Z- g/ z
+ {. b" K X' d' d2 g
std::vector < float > vec1(N);& t" v4 {$ k1 n" e8 F$ i
std::vector < float > vec2(N);% \) v6 s# d4 i x; a. c3 Q+ B
float* b1 = new float[N];
* U" S1 u( R6 ~; | float* b2 = new float[N];0 I" K# U" C; K T/ B0 [+ K; q, m5 h
/ L. B' z* h) r. {) e for (int j = 0; j < 6000; j++)' o3 }3 V$ B6 u' `' |
{* N6 B& |! T. M! P t! c9 x
std::generate(vec1.begin(), vec1.end(), []() {- g' D$ l, M; b0 E! \
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
3 i! R0 N* ~- G2 H- \ });
% x5 {( g' e( o
5 B4 Y' s1 f( n4 T A. y1 G& p std::generate(vec2.begin(), vec2.end(), []() {" V2 u4 c0 c% e7 y# N) {' G# }
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
) c5 e6 ] B% T4 I+ g) I, O2 ^' E });1 |6 M3 Z; m, v$ E- `2 _# a
* f( c' ^+ {) h r9 O% O: ] for (size_t jj = 0; jj < vec1.size(); jj++)7 e5 O) K- K/ S1 a9 n& U* e0 O
{
% c: M) g; d4 X b1[jj] = vec1[jj];
; B1 \8 I6 G2 \: Q }% F |/ s% P/ e6 }! ~! j4 u3 p
* V* M/ l; l, M3 H' |% \$ y" @) e5 ` for (size_t jj = 0; jj < vec2.size(); jj++)
4 `4 ~; ]: C& z7 f5 [5 d {/ ^/ v- @0 B/ ^1 C, f8 n' u
b2[jj] = vec2[jj];+ [7 K c' w, i$ f& M' e
}
& b* _5 H- T' @1 b% L. w
% n8 k5 i! f! d. ]/ [ //Method - 1 N=100000 247s . E& a# f6 Q! L+ \8 B$ h: D! F- p3 l
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);- @. t, O3 L6 b( n0 i, U
' Y4 p) f* B+ w //Method - 2 N=100000 237s* {" x( H; J5 L" ^0 Q
/*
0 N4 E3 C4 k" K A for (int jj = 0; jj < N ; jj++)& A6 t% J- z3 c+ W6 K
{1 W+ {! R3 o2 ~* V+ O3 u6 E- C( ?
fresult += vec1[jj] * vec2[jj];
5 e, p: n, B. O6 J$ {6 R" d }* k8 s! a2 H* T! G( Y b- T
*/
% U7 b9 G i8 Y. U8 f" {! \ ' P8 |" G+ c* c2 C0 ? t! S& y* K
//Method - 3 N=100000 204s
$ V1 F2 b. R* h /** |& s! W& k4 Z+ g
for (int jj = 0; jj < N; jj++)" U6 N4 c2 a1 Y. O9 h: S1 u
{' J/ K0 v y5 y+ z
fresult += b1[jj] * b2[jj]; Q" d4 _+ A/ R# W# D p
}0 z$ ~2 ?$ q2 L2 s u
*/) s5 h Y: ?0 X
|1 ?0 k, j3 H: b: |) ` //Method - 4 202s
4 G4 R4 E) t) D" X5 ] /*$ k s& W* R9 w% h9 x/ S
for (int jj = 0; jj < N; jj++)
9 j& n$ I& w6 j7 {, b3 { {( I4 E% `" t. @, W' \6 @6 d/ \
; s* o" l' m5 [' a1 M- ~ }
: `; Q7 a: L4 s1 o5 f* d */
, Y: p+ B' N& Q //comment out all methods, N=100000 202s $ R" ~" `' R7 L' h E: C
} F& }# {/ J$ p
* q# m! W; W& q: i' a1 \ delete []b1;
& G C; m; o2 v( u delete []b2;
. W" ]. h i6 L, n: X |
|