TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 & Y1 Y N$ X, H @9 {" b& [/ A
8 T) ]$ G/ c; O8 _/ S! W理了理思路,重新做了一个测试。/ x5 E1 ], A( V d
做了两个 vector 和 两个 float *, 都长 100000
, b+ y" `' l3 X; h% I! q外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., r/ S2 L$ d. {
2 u, O9 c- f+ ~- d5 x
内循环试了4种方法,4 m) Q& W1 c7 t, S$ {+ v
1. 直接调用 vector inner_product 247s 7 j, @- A& ~; b( y$ o5 [+ a* \
2. vector 循环点乘累加 237s
8 p: _/ j5 Y7 @+ r! d3. float * 循环点乘累加 204s2 c; F" e- p! ]/ e- J) z
4. 空循环 100000 次 202s
* N% \6 f$ X% C' K" h+ F, q' H* A9 S2 j' f: f0 x: h
不做内循环 200s
9 |) r7 o" n' n
8 y r- V5 W( z* q% T你昨天说的对,内循环本身占比是很小的,大头在其他处理。
4 R* ?& L: G& e2 l另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) M8 V) f7 K+ b' W$ @
) z( V+ ^8 M1 ]+ \, u; j
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
; x# A$ r0 O5 Z4 b& ?6 h9 U, |9 d: s" R4 `
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)! P; ^1 `, s& M0 B q0 F+ ]
' F5 |( @* h# ~- O9 B std::vector < float > vec1(N);
0 X- k7 `$ {0 y# A4 k) Q std::vector < float > vec2(N);
4 @5 n4 z. Z8 R3 Y- M( t float* b1 = new float[N];) C; j/ Z& b+ Q* A8 c
float* b2 = new float[N];
: w5 _- d- [! d C6 k5 T3 }
# I- Y2 _+ r8 J: R# q4 c for (int j = 0; j < 6000; j++)
, t& q2 R9 r9 C" E {: E' e2 Y4 i# |4 Z! ~4 p
std::generate(vec1.begin(), vec1.end(), []() {
& p1 ^2 m9 w% r/ Y- _7 V4 `& A return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
$ ]' z) i1 p" J8 e! G, w });, z4 {2 Q% ^ O; t& h) X
) n/ u+ N6 z, c3 z8 \
std::generate(vec2.begin(), vec2.end(), []() {
0 J* R4 q& Y+ j, T0 U% ] return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
1 c0 {) D* M3 U" K z });
1 P; d# O5 e' o% \/ ~8 i1 l8 E2 ^2 K4 u0 ?
for (size_t jj = 0; jj < vec1.size(); jj++). h7 u+ W' a3 N/ r' W. f0 [
{
' A' H# C7 r# l b1[jj] = vec1[jj];3 s# l7 E$ F# F$ W
}& C+ T3 U, C+ O5 [% Q! u8 \- U
7 x: J ]- G; V' d, ~
for (size_t jj = 0; jj < vec2.size(); jj++)
2 [$ s; A6 l5 k0 c$ @9 L& \ {
7 ?( g% T2 n* V9 \0 S8 B7 \ b2[jj] = vec2[jj];
% }& Z; U: ~( z7 H. K. W: G1 m }) ~* p! |8 N7 y6 y
2 Q' V t% }, U" R0 } //Method - 1 N=100000 247s 9 @9 D. e/ T) e# n; l
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ S1 n+ Z3 u- Y6 T; P8 B
: m s; u( [- V# J( W& m //Method - 2 N=100000 237s) Q3 F1 S6 P8 V7 W
/*4 w y! m% w4 Y# s6 q8 r3 { h; D
for (int jj = 0; jj < N ; jj++)- _) Q0 f4 u1 \% ?0 p2 D
{
$ `& A" E; O& o fresult += vec1[jj] * vec2[jj];
1 N) m2 p2 q: k0 C }
9 A: i) G) r) y& D* o! B */. o' x6 @: _% z, o- R) }
n) z; j7 Y; n( X //Method - 3 N=100000 204s
7 x B2 F7 |5 U8 X7 }$ M /*
, l/ t0 l( K. L' O D9 v for (int jj = 0; jj < N; jj++)5 v7 O. x# j) v6 c# J$ C6 a
{4 C% ~/ X; P0 ^8 } W! O8 f; }# X4 K' Z
fresult += b1[jj] * b2[jj];
+ w+ H8 C8 a+ Z$ W. Q. u }; ~* V! v2 k4 q1 U- _ M$ |$ e1 |# L
*/
) h- ]' S! W8 N, l T1 {3 a6 J* \' x; Z$ `! }5 Q9 G
//Method - 4 202s
( B% _- y, x- S& }" }# w. O6 | /*) c" J9 W2 F/ Q0 I4 G* L
for (int jj = 0; jj < N; jj++)
' B% z4 {" l: w! j. @) ~; v( ^ {
" k3 `/ |& ~0 B+ {" y& p# v $ C' r# ]6 q6 J: h
}) s p- C* z! k2 C8 z9 B6 @
*/
) h8 a) v. j& A0 d* ? //comment out all methods, N=100000 202s
! t* ?# l- j }, q$ ` [ }
; Y+ v6 k; t9 a! Q
4 @* c, X3 {. d8 K& o3 Z delete []b1;( _( Y5 u* k. |2 w5 M
delete []b2;
0 m1 w6 w9 a- x4 j6 K |
|