TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
! S+ ^1 y: a! m7 A3 w; F
$ o6 @) i6 G& K+ V5 w理了理思路,重新做了一个测试。# C- S' E' {: a
做了两个 vector 和 两个 float *, 都长 1000009 J$ R0 c. X3 ?, G1 \ y: j# t
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' u0 L" v d# B- ~; f4 G
3 Q9 T% Z- G5 U" Z2 W
内循环试了4种方法,
$ F9 X) H1 O. d0 D' @1. 直接调用 vector inner_product 247s 1 o g; l, m/ _7 j
2. vector 循环点乘累加 237s9 `& [6 h- M6 p3 q) `% B
3. float * 循环点乘累加 204s
! t( ]* I4 X1 N6 z8 B. X- U& B: ?4. 空循环 100000 次 202s
/ |/ C0 q+ M0 G5 ~% d- ~& N' l6 d8 I0 W9 |0 ~5 x
不做内循环 200s, d) N8 `0 W1 v; G2 ^
1 @2 ^$ X; M B% P, ^7 A9 V* |
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
5 V$ }; { J8 G另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
l* y6 X3 m2 V- Q+ b6 B: v
7 ?% p+ A4 B V7 V! ^6 n( m0 g至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)- ~" g% k2 g# b( }
3 b* i, P, @' Y6 q( N) \(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL) H7 V7 M1 Q F5 g! k5 O
7 e0 X- M; a. R" m* b% ?
std::vector < float > vec1(N);
9 m3 v2 H; z) ?" | std::vector < float > vec2(N);7 E+ m) B' Z7 s( U
float* b1 = new float[N];+ D- P& R) y: K% k
float* b2 = new float[N];
! w- ` f" k3 B: d
5 G% v& H& {: R* S for (int j = 0; j < 6000; j++)- Z7 | q8 b% c. E' F( |
{5 W& r/ _1 C" D2 I5 v
std::generate(vec1.begin(), vec1.end(), []() {4 s( E. k4 p; W' w
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));; X3 p! F5 E7 j( O- o. A
});- E/ m9 M0 z+ S: O5 S4 Y! f
* ~8 B' Y7 o" D5 k
std::generate(vec2.begin(), vec2.end(), []() {( T; \7 u! |/ u' @. Y( |9 H, ^
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
: S$ ^- L6 W! f2 h0 {( T2 @ });
1 z. `6 N9 y9 c& b) s C7 V
$ T" q) ^3 R/ x, j* Q6 Z5 f for (size_t jj = 0; jj < vec1.size(); jj++)( x" D! F. h. R* b, |1 q$ O
{
& B) t2 B- ^4 j5 E" S b1[jj] = vec1[jj];$ {# j9 [1 q+ r% n6 E: z
}
/ ^8 I; i0 _+ p7 W" v3 r( l6 b7 L* X: ?
for (size_t jj = 0; jj < vec2.size(); jj++)4 l8 c$ }) ^4 n+ _- ]
{
0 c/ V9 {$ A& `* c; C8 ? b2[jj] = vec2[jj];
# @# l0 \1 r R- I }
# [% `5 V4 ` }6 F
! x+ q* i/ A* n/ a) W$ l //Method - 1 N=100000 247s # @/ Q F- J, D% \$ Q
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);) @- X, G. g$ l9 ]
. @$ @$ l$ z+ ` //Method - 2 N=100000 237s
9 V8 g# U5 ~) J. O /*0 o: n: x# Y* L1 ?! _3 G" p
for (int jj = 0; jj < N ; jj++)
- c% a1 m" L7 a- o {
) A, @4 z6 _+ ?" f% m fresult += vec1[jj] * vec2[jj];' a: t9 d- X& h! K8 P
}
( _ E6 O* f1 j7 N0 N */
. ~& q, z1 g8 Y6 L, {1 l( ?$ _
' e, M0 J+ C$ t: y" Q7 N1 D, _+ { //Method - 3 N=100000 204s8 v7 w0 B, \! o
/*$ P6 m2 ?8 `- O' |. F* Z
for (int jj = 0; jj < N; jj++)9 B* W. c7 B+ M- |
{
3 l* y: [! e X. S. B% F fresult += b1[jj] * b2[jj];! W) d" x- p- G% T
}
$ p0 V3 q0 ]& I$ l2 E- e# d */
- y6 ?+ r/ n* a5 {! x, I
0 M1 C5 e3 k* ` z //Method - 4 202s% }6 v/ e8 K0 u
/*
. o+ S% P" J$ G" x' J6 N0 z for (int jj = 0; jj < N; jj++)7 I4 x) U+ }% Q. G6 ?. N
{: g; A/ _1 [% n
. O6 S: n/ E8 r! z }# T, o$ b& }; ?# B* _; W! a6 I
*/
t3 S! v: V- H4 } //comment out all methods, N=100000 202s
# ?& t* f2 ~/ ^0 Q }7 Y9 h/ k/ ?; h5 r0 U" @1 D
1 ~+ y3 z# r9 o# S1 N4 e, r. T delete []b1;1 d% O5 _6 o, h8 a+ W
delete []b2;
5 h7 O& R' b0 n7 X6 ~$ k' d3 o |
|