TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
7 Y: ^( n) U' \0 a8 B1 k d
9 d8 u& o" p, L8 z- g& H理了理思路,重新做了一个测试。
) K1 n4 M3 I+ k$ j8 D6 M+ D% \做了两个 vector 和 两个 float *, 都长 100000
# `! Q/ e n4 g- Y外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.- z; W& \ l6 F3 x
# i6 P1 {) y& @& Z C+ I
内循环试了4种方法,
& X7 z- H8 l/ ? U3 ~. Y1. 直接调用 vector inner_product 247s / q+ Z# H% B3 t
2. vector 循环点乘累加 237s
5 Z" g' O' `$ O4 E# m% \5 `8 G3. float * 循环点乘累加 204s
/ @5 ?# q& H; i' S0 O- A) Z$ @4. 空循环 100000 次 202s* N2 s8 t/ O8 k; N2 `
1 `% P4 `5 c3 e不做内循环 200s
( a/ a$ O0 S# d- ?/ k0 v! o: Q
) |. o) }9 x8 q2 m! o6 h你昨天说的对,内循环本身占比是很小的,大头在其他处理。
0 G& {* X1 g1 T \$ {3 z' U另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
/ p, @9 d8 V/ y2 R, r) {' k/ ]* p$ U9 L- i9 z& ]
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
; G: g4 M1 e6 a0 X+ q0 y X; o
5 w, a2 j/ S9 j/ h0 P(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
, v1 s4 b! W [' P d& P) C# S
std::vector < float > vec1(N);
( @1 I' m9 ~0 v1 D5 B( n1 ?4 I std::vector < float > vec2(N);
: \* {% i6 V7 F P* Q float* b1 = new float[N];7 t. {% W$ C" R2 T6 a- V9 d
float* b2 = new float[N];$ G3 E/ r. o5 k6 z6 j B% B
6 F5 s4 T3 a- X for (int j = 0; j < 6000; j++)
+ ~5 `$ w+ G( L3 n {! d/ U1 b# g, b1 c# K) Z
std::generate(vec1.begin(), vec1.end(), []() {7 `# @& g9 Q& O4 i" W; m7 t! H
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" }3 n5 v) }% V0 E4 \. R5 Q( o, G
});
- G S, [: V$ a5 }! k( c' F0 G# F6 X4 ?; `1 L
std::generate(vec2.begin(), vec2.end(), []() {
: p' a; k( J3 Q& Y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
' w9 @- X6 h8 t+ D });9 u+ ^1 U6 f% x; h- m
/ @! D4 c/ a6 M$ ^* O; Z
for (size_t jj = 0; jj < vec1.size(); jj++)' q5 {7 E5 x( _7 D; z+ S
{
* e- W5 [- y: f b1[jj] = vec1[jj];
) \+ b. S1 M5 {0 m; a/ T' C }
* [+ N: q5 i: ^& y% c3 e9 w U
8 X7 @! e" p/ h: a1 n0 _5 M, q for (size_t jj = 0; jj < vec2.size(); jj++)
) z5 D! ~; x$ U. B! F- b {
8 W1 @: {) d; i' J b2[jj] = vec2[jj];
7 v# w+ T7 U. C, s1 t }
6 {. U# S9 D' p7 x' }9 ^) H% c O' [3 ^ c; H+ O- ]3 `$ c
//Method - 1 N=100000 247s
# p/ `+ l6 N" s# O# t6 V% W! c9 y: E //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
- m* I( Z; x7 h8 L" l$ ~" k; I
- D$ I$ c0 O4 O5 M# P4 L //Method - 2 N=100000 237s% Y5 `8 ~9 D- O9 [6 a
/*
V' I! ?' ^& N) j- H# ^* N1 [ for (int jj = 0; jj < N ; jj++)
# d, G& ^" J7 V1 x1 \2 I {, F. X9 c% `3 @' i, j
fresult += vec1[jj] * vec2[jj];
6 v+ d; r! ?- j, v }
/ U' y7 I1 \" d */3 \3 j7 k1 l5 }( x* |4 n& h
/ a t. q4 O! b" b# `
//Method - 3 N=100000 204s" w% j. ^0 R0 @' \
/*
j" O0 [: J6 h$ e2 r for (int jj = 0; jj < N; jj++)+ J9 g4 A l% N9 d( }* ~
{9 K: F q" g% b) Y# {) O& U
fresult += b1[jj] * b2[jj];
0 o- _1 A T l& `+ T }
& H. T; c: O" V# M */
& e* P& p0 p; ^# _, [3 P5 Y% e9 I& d8 j: |. p
//Method - 4 202s) ]. h `- F. \/ }3 t! P
/*
6 e" O- O& n2 T for (int jj = 0; jj < N; jj++)" q0 j: y, G9 S7 w" D; K
{1 m6 `9 z2 C( j) J/ y% X
2 |$ x' R- |! w" ` O2 m2 ^ }
5 y- y4 D# k8 }5 a4 ` */
& a+ C# G7 P! F* T$ Q //comment out all methods, N=100000 202s
' i. E: D% l- u" F }
2 h4 k% I" t: ] v; [8 X3 ?$ `1 W5 w4 \
delete []b1;
. H1 L3 ?! o Z8 P( [6 e delete []b2; / s& _! [/ g+ e
|
|