TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 # {! n) Z0 J. Y
" c+ M# @& i. h- D$ a+ a- v4 ^* ?' }' m
理了理思路,重新做了一个测试。- c. r4 j o8 J1 u/ s
做了两个 vector 和 两个 float *, 都长 100000: R8 v2 T3 \7 P: D( `. ]8 e
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
" e0 c; n. f' i+ Q' F& L1 H2 V5 e9 ]& d% z
内循环试了4种方法,
* ^( f4 y% ~( d3 Q& ^1 Y* [% r/ r1. 直接调用 vector inner_product 247s
: O: s+ Z- K8 W/ W" J2. vector 循环点乘累加 237s
& N0 ^; D$ F# b( k2 ]; e5 x3. float * 循环点乘累加 204s7 ]/ \8 Q' o8 `6 \" h
4. 空循环 100000 次 202s! P4 U0 u8 B+ s, A( {# u
' P5 A) z6 Y @& k不做内循环 200s
! V+ C- t" B9 N# o; D- n
2 A6 E4 D/ e0 [" j% l8 W你昨天说的对,内循环本身占比是很小的,大头在其他处理。# [" a$ _8 q$ O6 h6 R( e- _0 w
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
5 p5 j# V2 K& M6 X( P) B" f. ~- b) r4 t W5 L# i
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试), Z1 ?, r& L# j" q9 O
( E; u& |2 K0 e( b/ r1 J(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* n& I- }( Q4 W/ t! Y3 q1 e$ {
* P9 s$ R0 s( q- P3 K5 h- v7 N std::vector < float > vec1(N);
4 a v* d, e8 i: h. y9 m& { std::vector < float > vec2(N);
. C7 H" [+ s3 z! F) n. a0 @- L float* b1 = new float[N];
8 Z' `, o/ L8 m- }/ W( _, d8 t float* b2 = new float[N];$ C' B1 k7 X( K
! p6 ]+ V) N8 A. n- W' h for (int j = 0; j < 6000; j++)
6 _/ i5 m! ?9 [, T! E6 P8 z {
A3 T V5 ?7 T% \ std::generate(vec1.begin(), vec1.end(), []() {
1 F& H/ O" w' y- H* D1 O return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ ^/ {+ R l+ `! f8 J });4 j, [# {2 L. U3 j
* a9 T" a6 f4 X, ?$ Q std::generate(vec2.begin(), vec2.end(), []() {
" B$ r9 j5 A: E1 t) l5 h5 @ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
- ~" E) J; |8 P0 }2 p2 i });
# s& [0 h ^8 M9 Z9 B" t! k" b# @" L" ~; d3 Y
for (size_t jj = 0; jj < vec1.size(); jj++)
0 H' J5 N2 X E4 g {2 W3 i8 y7 S+ ?/ O9 z
b1[jj] = vec1[jj];+ c* r4 j6 }! W( U H- I
}
, Z# `( Z" [: `; u: }* d& ~7 M+ T. P% W5 D8 w
for (size_t jj = 0; jj < vec2.size(); jj++)- I2 A4 w9 b( w1 v6 I8 `% |
{
+ J) D$ k% u8 ?* A3 A- [ b2[jj] = vec2[jj];
* e0 f' ^$ J7 `9 v! k | }# T+ J7 J4 s6 x4 B: h
5 A( S1 W! [; K7 ^5 K6 e //Method - 1 N=100000 247s
' _$ O! i; P$ k5 V //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);, }- \- P. f* t1 Z( X+ y* A& a
+ |1 _% K; R6 e2 @- J' C) U
//Method - 2 N=100000 237s! o! q( d! w Q @+ I; D5 T8 p
/*
" i! C" L: p& R# r, g2 q. v7 a+ u* G for (int jj = 0; jj < N ; jj++)
0 H5 R2 T% _. K( T6 O& Q& }: a {
4 O# |' ^) J" M3 W7 Q+ ]* Q: [ fresult += vec1[jj] * vec2[jj];5 X% h0 E: O8 {: g' F
}6 F& e/ N t! F
*/
* I$ h1 K! A2 q2 h
- F. J+ h# e A. y+ W //Method - 3 N=100000 204s, h# e+ `; e8 q# q
/*
0 q" N# L. j0 l- e( Z for (int jj = 0; jj < N; jj++)
; w8 c4 n/ ~, b+ c {+ X" j2 s( l. I: o+ q! l9 M4 L
fresult += b1[jj] * b2[jj];6 V7 j* C0 I4 n: {
}' i8 ^" Q7 y/ o9 I! U9 h
*/2 R1 |8 w9 L4 M& D! g* K7 k
3 O- g8 E; m% l5 U% u //Method - 4 202s2 T0 `! C" L8 R8 p2 ?2 s
/*5 o: g, m1 m$ E, U5 Z0 J
for (int jj = 0; jj < N; jj++)) R+ G/ Q2 i4 c3 ]
{: C2 l1 }7 B' r; t. c! @9 r+ M
, K1 @+ S6 ^0 R( d& C7 p6 l }% L8 R. J6 \5 I4 N+ V& j1 v
*/5 u) ~; f$ H3 m j2 K
//comment out all methods, N=100000 202s
3 u% ?+ B& p+ e0 g/ n8 ? }2 q: I+ w) ~* |) o, z2 [
8 S: j+ d! d L1 z9 R delete []b1; A @% O! O4 C
delete []b2;
% Z+ r: W9 W- S |
|