TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 # `) g* g" ]) J( Q6 J; |
! |7 x. r9 V' j理了理思路,重新做了一个测试。
, x7 G- k7 F2 R/ [, t2 x$ q做了两个 vector 和 两个 float *, 都长 100000
0 p9 I4 `: G9 @# r0 X# Q+ `外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
Y" J( \, Z: ?/ o1 ^; q
# s$ ]0 M. | o8 V: e y内循环试了4种方法,+ R! z% f# N# S
1. 直接调用 vector inner_product 247s * S: T0 w1 s4 O5 s! G* T: r4 L
2. vector 循环点乘累加 237s
! ?$ _! d3 N/ V3. float * 循环点乘累加 204s: g: X1 `8 ]. x }4 N
4. 空循环 100000 次 202s
) p6 o" l: A( y2 Q/ A( K4 H' R p4 g8 i# X
不做内循环 200s( g7 G0 E& f' L* Y N
) [$ L# a5 D# K' ?
你昨天说的对,内循环本身占比是很小的,大头在其他处理。, C0 L: A! i2 k
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
8 Q; x% _2 |' W2 a+ u; w3 p) @2 q" Q" C) H3 h" r, z
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
- d$ C8 l @ j- j; r' G: a
4 k9 w/ S1 z( K5 v# p' [' w(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)( X* [0 Q c1 O* p0 Q
0 W/ W' B: B* z( J5 G1 Z
std::vector < float > vec1(N);
" G0 l' O% w. m3 J% U! R std::vector < float > vec2(N);3 m$ g! w4 |- I, b/ D; W w( Q& q
float* b1 = new float[N];
( `% ^0 M/ a& M; W R float* b2 = new float[N];
6 s9 x( v) W$ P! t' h( I- q- d8 {* Z) q* R I" `3 c
for (int j = 0; j < 6000; j++)8 A6 _/ Z' g* W
{% O3 c9 l3 I; k: o* A# i' S# e
std::generate(vec1.begin(), vec1.end(), []() {
, y, y" Q7 {6 ` return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
( x5 G* L0 u) l/ ^2 d0 h });( |5 d( B% j& j5 c: u; M+ W
/ W9 S# ]. [3 N$ S2 b8 ]
std::generate(vec2.begin(), vec2.end(), []() {! [) S5 a+ s |. s) n
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
6 [' K" P+ w0 j! c; e5 ?& M& P });
& O; v' H! v5 P7 P% ]' s9 G8 S; w) i8 c7 Z8 ?$ x
for (size_t jj = 0; jj < vec1.size(); jj++)
9 H: e3 C. }* C: @# R' V% B0 J {
$ Q+ G5 j0 |6 `) A) p* L$ O b1[jj] = vec1[jj];
% Q) o! W7 Y5 y9 H6 v }
8 u. R3 t/ i+ A4 A$ u0 y% w3 D8 V3 `% a
for (size_t jj = 0; jj < vec2.size(); jj++)
$ h. P, v* X" X; Q. J {
6 w$ l- ]7 a/ r* n" [ b2[jj] = vec2[jj];
( p" Q' n/ x5 o8 z& } }% x% m# f& F% p# i& f! M6 ]
4 O# ~4 t" b: U- ~0 _2 r
//Method - 1 N=100000 247s 8 }8 d" |* P) V) }
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. c; O* s, @: m1 G2 r % S8 Z, q8 p8 G w) @
//Method - 2 N=100000 237s* Q; P8 }3 a. A' R0 B) f
/*, s$ c) ?9 B: i/ o; _9 j
for (int jj = 0; jj < N ; jj++). ~/ A, Q7 I# ]! v
{
' O' r% M8 }: ?1 z% B fresult += vec1[jj] * vec2[jj];
8 u4 R$ B2 }7 k9 S) m4 s$ V, P! | }6 n1 N- Z& w; G9 R5 a0 T: ~. |) S
*/
( v9 _+ @( o* B1 X" a
9 q4 _4 |8 Z: r4 o //Method - 3 N=100000 204s) y0 w) P8 A# E J
/*4 W `4 `2 K1 N2 H* U# M- i
for (int jj = 0; jj < N; jj++)( w) z0 Z& J! Y# G; }7 O
{6 t' U! I" j8 v5 y3 o
fresult += b1[jj] * b2[jj];, b! a( i7 @( u3 _, M0 g
}
4 d* P" W* t( K5 Z */
/ S0 f, S9 G/ y& L+ |( X0 {! `
* c4 f5 Y0 l+ W% j7 A+ i //Method - 4 202s( }' C8 K+ d) U1 [2 c( A6 }
/*
% U) u4 B$ z) ? for (int jj = 0; jj < N; jj++)
0 W/ b5 |# ^- X# @' q2 Z1 V9 W {
% v$ H+ q: l+ e* K; A
$ x( g( y+ b2 S3 q: p' @( u }
9 T& a" U) }& A */
I/ z; ~; I! `( ]6 J8 m! b3 O //comment out all methods, N=100000 202s
_1 I$ j; Z6 U5 u" v }/ M+ |) \# w S) Z6 y# s5 l& z- K
8 d. L o( R) X% i* M+ E: B delete []b1;4 H2 p! w: D) Q1 ^7 T# W
delete []b2; 3 _: P: i }( u# _ M% c
|
|