TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
: L5 V& ^1 f9 x% {2 E. O0 a! C* O" j* i; P) t6 O9 Q
理了理思路,重新做了一个测试。; z& _3 u o0 e" L
做了两个 vector 和 两个 float *, 都长 100000
/ e" {% ^2 y3 V7 `8 z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' u# O& r1 d, @5 \+ X; H
# S6 J3 D( [. X内循环试了4种方法,2 E" t* Z7 w, T& D- W- }
1. 直接调用 vector inner_product 247s
l" V# y. ^# c" \2. vector 循环点乘累加 237s4 y, K9 N9 M* Q$ a. u2 {
3. float * 循环点乘累加 204s
& D4 W" N7 w. n! j4. 空循环 100000 次 202s2 s( X% x6 @0 t; n
+ Q4 N; a+ h* K7 k+ H& C不做内循环 200s
- X4 m5 D2 Y+ x4 V2 y9 p
* A# M( `. _ Z, R- T" ], H你昨天说的对,内循环本身占比是很小的,大头在其他处理。
r. m# S1 ^( S; d) }' Y另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
8 x. i1 h3 N6 f7 T/ i& ^% b& d% A/ f( |) K7 K6 ~4 M. I; x
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( n: h6 a+ j' ^$ l) N7 i4 u& T5 q
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)* d9 j7 D" n5 I- R" v7 e L" j+ v- l
$ T$ y2 X2 z6 c7 v' D+ ? std::vector < float > vec1(N);* H8 I0 l W: ~' m# q! M
std::vector < float > vec2(N);
2 t6 H! i; P C, r float* b1 = new float[N];$ k" ~# c, O: L/ F/ w2 i
float* b2 = new float[N];
; \, w$ i% ~4 L& N) t$ h9 w. w8 E: W
for (int j = 0; j < 6000; j++)
; j2 [/ z7 D/ v6 F' P {- \/ m* B$ f' Y% X; a( i7 S( {
std::generate(vec1.begin(), vec1.end(), []() {! _' P r U* O4 d) N3 U
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
, D2 p1 J6 }- K9 J& i& C! r });
( I- i; ^- z: N
: N# c' ^* D+ i8 P3 i& I$ { std::generate(vec2.begin(), vec2.end(), []() {
y+ B6 t: r/ F# S: W2 w# M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 @. ^* q, J0 }! `# e
});: v6 V" }: H+ [! Z3 h
- ]( e' p4 c/ S for (size_t jj = 0; jj < vec1.size(); jj++)
/ F' A* f, ^5 [3 k% x {
2 v/ O# t0 \; o* v% {- V3 C: L$ s b1[jj] = vec1[jj];
+ ?' i7 i8 x7 h } X9 e& h! z4 _+ m$ I: i
4 F2 o J! z$ ?# \
for (size_t jj = 0; jj < vec2.size(); jj++)4 j+ L/ R0 }8 ]0 n# c
{
4 X) I/ g0 ^4 p F7 z' u! G b2[jj] = vec2[jj];
( [) M1 [/ R7 X: h: i+ i4 i2 ]2 ^0 r9 Y }+ b: P1 Q j7 ]3 ~6 {
8 N; ? g7 g* J/ S) e# O- b
//Method - 1 N=100000 247s
: J- @/ K5 @" e& |7 m0 N2 l //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);$ u# G) E$ p$ ?3 l' ] ?/ `1 I5 I
/ l; s1 D( v+ v; Y. v* ~ //Method - 2 N=100000 237s( c& _* r$ E% a7 p
/*
' ]! E1 X* {3 |! y/ P for (int jj = 0; jj < N ; jj++)
3 E, B! ], x0 s; s( L& ^- ` {
) p3 t9 q/ n8 b) L0 I. e* }( [ fresult += vec1[jj] * vec2[jj];
. M7 y' g" v* f# H8 G9 {/ E }
& D* H! E% K0 u* x- | */
8 _; o! a" ~/ x) H
: Z' a; {0 `6 _1 m9 S" l //Method - 3 N=100000 204s
l/ O- s; T# |% F /*
1 I3 X: e# S$ c$ k5 o. K& {7 H2 X for (int jj = 0; jj < N; jj++)- V% `0 R5 B+ S. N$ ^: F5 |$ M" O
{
/ F7 G1 r w( \6 ~/ S5 r6 [ fresult += b1[jj] * b2[jj];
! p5 o" @" |* X; b }" y7 w% x# G1 E- W1 J( O* {
*/
" y" @: F& F4 d# _+ v' Y7 u1 C: l
//Method - 4 202s
& Z! r, \* w3 [) I /*; b0 |; L& R1 m! T$ {
for (int jj = 0; jj < N; jj++)
4 p! B' Z! A( E9 K& n {) @1 L; ]8 z+ n; c7 Z
: f* j# U+ u0 }, n5 [1 q' x8 l g# i
}
, {7 X3 e0 z# ?7 Q( _& H */! c, u& g2 u# W2 D6 i
//comment out all methods, N=100000 202s 1 S3 O; ^4 w# [ V# L
}
% z1 I; I3 o) c$ b- q r. r9 r" a3 u' `4 n
delete []b1;9 f) N3 T' G) R$ J( W
delete []b2; ( f# l" p5 y" c) p0 M
|
|