TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 # c$ E% }9 E; n* `" B/ y9 R- a5 H
- o! u' J2 s% L# w& w理了理思路,重新做了一个测试。/ y, S a9 i/ h% v: }. q! c$ q
做了两个 vector 和 两个 float *, 都长 100000
N/ z( V' b" {) n4 k外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
8 l/ b% k& T g4 Y( M7 b" E. q: u. h1 i1 J3 H
内循环试了4种方法,3 ^6 P2 W* T8 {$ n
1. 直接调用 vector inner_product 247s 4 y# L& P- R9 e1 z2 t
2. vector 循环点乘累加 237s
: O8 ], n: [- X# D7 M3. float * 循环点乘累加 204s
3 S& A7 z( x2 T4 L4. 空循环 100000 次 202s( x3 q# P8 q7 _: L
6 `* I0 ~, r8 k% q4 y
不做内循环 200s- X. Y2 Z% } C' c4 [5 |1 e) @
$ p. T+ P; a* S( y4 f6 D
你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 ^; w. W3 \1 H3 d
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
* q) c- T% }7 ^- \- K) K" g9 G1 p0 q! J
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
! m" A' j0 Z' ^
" j; u6 M k+ S(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
& `& h$ l& u8 v6 a0 T
. S+ ^& }, W2 {& z% Y4 }9 B( M std::vector < float > vec1(N);. O* G+ U" G( w" z: m' d
std::vector < float > vec2(N);
$ M2 Z- `7 l9 d: @ float* b1 = new float[N];
1 H( u Z7 h' U" ~: E" C float* b2 = new float[N];
) n. V+ K6 {- B5 W1 c
9 S5 [; {8 l# r( |8 x8 h4 E; Q# H for (int j = 0; j < 6000; j++)$ H7 r, ^0 `' v: u
{/ z$ U o) ^0 J5 G
std::generate(vec1.begin(), vec1.end(), []() {
# z* w. V7 D$ j2 G& _1 d return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ ^3 a; @, T# T+ t" a! T7 s) S- ? });
2 ?5 m1 t2 C; Y) _$ n; x7 W9 C, G: U, w! J% U2 f
std::generate(vec2.begin(), vec2.end(), []() {
1 P# c6 }2 O7 T return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
- c# a- a! g! @: z });
+ c1 H. |5 |( u- J4 ] N) {- @, E6 a4 I7 ?; Y4 `2 d" D6 |
for (size_t jj = 0; jj < vec1.size(); jj++)
$ R8 ~! F! x0 J# i1 r) ^ {
1 |& U' k1 t K: p0 y5 J4 c+ k b1[jj] = vec1[jj];
6 @3 V" S. @- t7 N8 x, y9 [& Y }
) |' W3 C9 M1 i% T7 c4 u$ ^* P8 e0 R* c- J% ?6 V
for (size_t jj = 0; jj < vec2.size(); jj++)
& G2 i. ^; Z! _3 X! j2 R {6 V# D( t: z. `6 D' c% P
b2[jj] = vec2[jj];
0 [1 Z+ j! y6 d5 L" K }
& I8 B7 c" g {9 f# X6 g
) x- m& @+ L5 @+ S //Method - 1 N=100000 247s / T$ g- d9 M+ s) |- [9 o( s
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
- W7 F; v5 U3 J1 g; _- [3 Q' K 9 ^7 J6 k+ {9 @# S( g7 k7 W
//Method - 2 N=100000 237s2 q& g/ h5 U+ x9 d: {" U
/*
! ^6 |+ ?. g. |, q% J0 v for (int jj = 0; jj < N ; jj++)& v2 u: W6 R$ [2 u. w
{+ Q8 P4 I5 e: Z- l" h2 K
fresult += vec1[jj] * vec2[jj];
* h [' V: C% J9 W/ J8 z }
( W- j+ x6 X0 Y9 t* Q9 l */; k, n1 ~8 D8 t% S
5 x' n. l, Y& @. G+ B* ]
//Method - 3 N=100000 204s/ A2 M+ q% _ Q
/*
^9 |1 S) t# u for (int jj = 0; jj < N; jj++)
7 S2 v" k3 f1 Z$ x% X {
; q4 F9 j0 O. L6 o/ X fresult += b1[jj] * b2[jj];
$ J V0 V" X9 B( ] }
% o" {/ c. `0 H */- R9 c1 ]0 E+ H$ N
! d: G# }- t2 l% @ //Method - 4 202s! Z, m8 b2 A6 u
/*
, t. O$ z9 ?3 d' [ for (int jj = 0; jj < N; jj++)
' D4 X: \2 i: W: @9 J {
0 `6 E, I# s \* @- U3 b8 P ( F* f5 Z' T& N4 S7 O [
}
# l! r8 I0 g/ c# o8 Z2 U5 U */( _. l1 e* l( {( U! w
//comment out all methods, N=100000 202s : p* w) |& k- ^% ?" o' N
}
8 n1 n0 r! R- [: ]4 V3 n. j, \ ~: |0 e1 L6 C( t' V
delete []b1;* n% I# p$ w1 r& ^* E: o
delete []b2;
7 o% \1 D4 Y" H! W. h, V |
|