TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
K2 v! M7 ~4 C/ h( Q
$ K x. U" B' ~' J理了理思路,重新做了一个测试。
1 a" W1 n+ u" Z3 W做了两个 vector 和 两个 float *, 都长 100000
& Y3 s, d2 P: V5 g# `# }, B外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
6 U# G7 I9 Z8 o$ G# t/ l; m
( g7 B2 x4 k( [' n内循环试了4种方法,& I+ B! c6 u+ |; G
1. 直接调用 vector inner_product 247s / P5 e5 e9 M# g5 C
2. vector 循环点乘累加 237s
2 Y, K% m" k2 \4 \) W0 g3. float * 循环点乘累加 204s
7 M% b% B B" V4. 空循环 100000 次 202s
5 z2 O8 n' ~* }/ ]& N s2 P4 f4 |7 I9 R3 E4 g- x N$ x& V
不做内循环 200s
0 t5 Z* P7 v7 G, B4 ?8 q$ C0 ~- {0 T$ h, {" \! w# n# T
你昨天说的对,内循环本身占比是很小的,大头在其他处理。- S- K5 k* t3 m* @ k
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。: n4 S0 F$ E3 ^; h# k
' a# G" W3 V) `2 v3 e) [! I至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
- ~- @3 m1 B% X2 H6 v; i
. T: Y0 n3 V3 A) o4 d6 ?(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
; Z- O7 R$ C5 `$ g9 y* f' F9 t
: s1 [0 Y) F Z9 `! W; u2 W! `- E std::vector < float > vec1(N);
( y1 ~# r q8 n3 @ std::vector < float > vec2(N);% R0 _+ J! c" b5 M
float* b1 = new float[N];0 q2 N' s; m I6 m a1 C F/ @8 k
float* b2 = new float[N];- h1 b/ b; s( m- n4 \0 e
z, y ^4 H" e
for (int j = 0; j < 6000; j++)
h' T+ h* F- T k" D! b4 U {9 E+ |7 X7 W% X4 J, u4 P
std::generate(vec1.begin(), vec1.end(), []() {2 N6 m& K9 B7 o& L* L/ l
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;3 g% o* Q) m1 P P6 d7 z
});
1 n* o3 {4 s8 X/ q. O: e& t$ K5 B+ r: K- F* ]% n) Q9 s0 ]
std::generate(vec2.begin(), vec2.end(), []() {" c- l8 K u1 [' ~7 C
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 [1 b1 h9 q: U, o4 G) O4 Y' j
});3 }1 T6 k3 }, V
6 f& a( A! P: v( N! W) u for (size_t jj = 0; jj < vec1.size(); jj++)) |/ D n9 m8 E* @- U: ]0 i
{
/ h) h) V) K3 l, y7 h9 l3 n b1[jj] = vec1[jj];$ ]: q/ U- \7 ~$ G8 @
}
% ~! h9 q q; f3 X+ d O
7 {& {: Q8 ]3 d1 g4 G for (size_t jj = 0; jj < vec2.size(); jj++)6 l! ]6 O5 m' N( y
{
' V; t2 r) o4 v0 H1 F" R b2[jj] = vec2[jj];' T! V* ]/ B3 @' Y; d
}
5 O' `7 B) |+ `( t6 K+ i, n
- d) O( f) m5 T4 Z //Method - 1 N=100000 247s : \* h# @- s9 _% w8 P
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);8 \% |& D3 _ _7 @: l
% A: g9 u, w+ o3 f //Method - 2 N=100000 237s
% T% Q7 s* x+ p" p" }: \3 f; ? /*! z9 J/ F/ l; C
for (int jj = 0; jj < N ; jj++)
`- A5 e7 I5 f H8 j% Y {, O, ~# _2 l3 P' b
fresult += vec1[jj] * vec2[jj];
+ |8 V1 Q* W$ X1 K+ a }
& g' ?$ j) h/ {1 V: D3 w/ y */
; O) u3 m7 T! A! [0 U
. z* n$ p2 R5 F/ S) {( Q //Method - 3 N=100000 204s
" K, H' L! t I4 D [# Q w& q /*6 W8 ~6 Y4 N; l: b2 V/ R: M* W+ T" d
for (int jj = 0; jj < N; jj++)( \- X3 n& [/ P$ S) g0 D
{
1 B" U6 U/ _+ v9 [ fresult += b1[jj] * b2[jj];$ @' ~8 f5 K% v+ \, R! p% V2 |4 Z
}. q5 C; g/ D% d# h, p
*/
7 L' J: U s: s8 H+ ^9 a# [9 D* `" t# v5 n1 c; N) r1 w
//Method - 4 202s
* ]9 W/ ] e( j# u- L$ d) }0 D } /*
; E, s: ?* r K6 `; p for (int jj = 0; jj < N; jj++)8 c0 }/ D/ v8 v6 Q) l( c
{+ d- Z/ R# b$ L. M+ N! K
2 W4 a, o+ a3 H x4 ^ }6 T( L# m5 l, h+ B
*/
2 x7 Q. h, g- ` //comment out all methods, N=100000 202s
0 _8 W: {" `1 s: u+ f6 J& V; _ }3 g% a$ L! R0 B' g2 z- l1 V. `+ s
; N; a6 I/ A1 \; f+ C( u
delete []b1;
6 a4 x5 T9 j4 W% l4 u delete []b2; / K7 O: O7 j$ g' L5 p( f
|
|