TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
' P3 l2 x" H# N" s% a* s. q
, y- B. r( V1 g+ [理了理思路,重新做了一个测试。3 r7 I3 q! I+ ?7 G) K3 x
做了两个 vector 和 两个 float *, 都长 100000- q c3 M8 Z* O" E* x
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
) P! ]' F4 Y4 D- K+ r3 J$ Y' I( z6 i. c% @* @
内循环试了4种方法,, _1 c* d0 Y8 Y2 X: I/ e4 B+ e$ H
1. 直接调用 vector inner_product 247s 8 m3 q7 o& w3 E
2. vector 循环点乘累加 237s" B6 W% b9 w4 a5 s
3. float * 循环点乘累加 204s4 A2 H: z2 Z4 e! b$ t+ R
4. 空循环 100000 次 202s& s1 `5 y( U4 m8 t! W: V$ [
; [1 s8 o8 m) d- m# K
不做内循环 200s
) E. Z ]- R1 g s6 v& r( X, r+ I$ y/ x/ u J
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
6 R3 m7 N' r( ~: E& ?另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 @ i" W( b+ y) r1 x! o
$ C! V9 p7 @" S9 a' e/ r
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试): i c5 d* k* O/ Y
, g3 P" F" q, u' J
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
. H; G; ?' o' b, c" i1 S8 ?2 t8 a6 J0 B( B
std::vector < float > vec1(N);
0 e+ X; ^. z" [6 H2 S std::vector < float > vec2(N);
- m& Z# s$ `4 m" Q float* b1 = new float[N];
" J3 p. H! B. p2 ^ float* b2 = new float[N];6 N- t; q2 Y, ?' f" V
" p- @, f3 o" o/ ?1 |1 S- t for (int j = 0; j < 6000; j++)0 H# d( w }: h
{
' \- ~4 f6 F' f$ G std::generate(vec1.begin(), vec1.end(), []() {
0 f, f' t! N e) M8 Z( m7 x return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;; c. p) l# P( S2 W
});5 V% x v% A9 _* ?' v0 ~
2 P3 B# `1 {$ w std::generate(vec2.begin(), vec2.end(), []() {. R8 X8 a1 L- m' u7 {5 f0 m" s) ]4 g2 P% B
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
4 g @: E$ P: y- l- e. D# @8 x });
5 L* I I# c# t) L! c9 z p
! z" A& R2 h) K3 z9 e for (size_t jj = 0; jj < vec1.size(); jj++)
5 x& x: q" I( F- e7 N% s$ k {
9 w5 h6 a& \9 w) v6 k/ `4 X3 z5 U, x b1[jj] = vec1[jj];
2 T0 L# U' o8 Z- a. V( T+ m4 [ }/ n" O1 J, J3 Y/ u- \+ q
. K/ b: S. O6 H1 d1 u
for (size_t jj = 0; jj < vec2.size(); jj++)
8 v, L) M- K- T6 w! k5 O" P {7 {1 ^9 N- x( Y# e+ O1 R
b2[jj] = vec2[jj];+ u- Q+ M, i% a0 s
}
/ l1 \4 O" K' @+ Q. J1 k
0 L) v. k; H- ~, ]( l //Method - 1 N=100000 247s
0 U8 R' j9 s' A& L) r //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 |, u& C6 q/ {- c `
4 `. T/ G; g7 k& j: G6 ^ //Method - 2 N=100000 237s
+ U5 a' _ r( j /*% O" E+ J0 V3 r E# r
for (int jj = 0; jj < N ; jj++)* m' i1 t4 B0 b. h# A
{- f% O- O4 X* V; ~: Q
fresult += vec1[jj] * vec2[jj];
6 ?; \. ?/ X0 G4 h9 c1 S }) F: L8 v {& v+ a& ?/ a! L
*/
& X! p0 Z+ J. V9 i
, r2 Z5 E5 Z% T& F8 @$ G9 g //Method - 3 N=100000 204s
4 p8 x7 h2 A7 d! }# | /*1 P$ I: {1 F* O
for (int jj = 0; jj < N; jj++)
+ U% Y" @! y& f8 x" c9 O3 F0 q' D {
# `7 c7 q3 x8 M, o; a0 N fresult += b1[jj] * b2[jj];, a* ]7 H$ {6 b& a7 q7 G
} d9 h7 L" u9 G+ y E# X2 {
*/
: ]# A- X, b3 J, G
9 `( V( D+ i/ V7 ^ //Method - 4 202s
+ I, y! D: _. @( } z- u2 y /*
5 _, E" S" w' r for (int jj = 0; jj < N; jj++)* u7 y1 U! {5 ?) G1 }( w
{; U+ o, @7 t9 _0 X+ u* N9 G% z
! {* p P! i6 L, b% O" j& R
}2 e3 D7 @3 O3 B& k% N2 v
*/
& a- G4 k( ?8 u //comment out all methods, N=100000 202s
6 U! _' j% b9 f: Y3 Y, p }
7 \5 ]0 o y! b# `4 j
: n2 t6 H0 _0 \3 g# ]+ m; p# O delete []b1;8 k" b9 A9 y0 k+ ^1 k! Q$ o( H
delete []b2;
! D7 _2 r# f% G' a |
|