TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 6 N# y8 z5 `% y
1 K8 y6 o: W# X: O* J) W" v* _6 J理了理思路,重新做了一个测试。
3 I. c- ~9 t' m \做了两个 vector 和 两个 float *, 都长 100000; ]/ Q( R2 X" f, Y( R" {* C5 ]
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
* \1 A5 t0 E& s( t8 a
3 k* G% ^) `! c! S4 e5 w0 m0 T内循环试了4种方法,6 r# K' _( U F0 I4 H4 V
1. 直接调用 vector inner_product 247s $ k2 p5 `: y0 e7 d. P
2. vector 循环点乘累加 237s
( g9 e0 J7 x* b* g* s3. float * 循环点乘累加 204s' r' A a* q9 ?7 i
4. 空循环 100000 次 202s9 B4 h' C. G0 l
7 V2 K& M# p+ B不做内循环 200s$ k2 K/ D6 C9 ^# J1 v
; Y2 I) V/ z7 O$ o5 {, a/ _
你昨天说的对,内循环本身占比是很小的,大头在其他处理。' h" X) s. w3 L* m$ A, G
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ F# q( E" A& a; x
8 q0 @* ]5 `* ?0 g. x6 t9 @至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试); n2 K' d# g8 r0 ]' u. O! |0 \5 \, M
1 e9 g; s5 p2 Z) h" R7 Z* ~! h
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
7 _# l! k& A; d( N* K: c) o
$ w9 g" G) X7 L. w. ~4 [: T std::vector < float > vec1(N);; [" w) {6 J. B) j1 [
std::vector < float > vec2(N);4 G1 b" p, W P9 W# G+ N4 S. T: M3 j
float* b1 = new float[N];- F! i& h) ^5 d8 {: v& k: U
float* b2 = new float[N];
$ z3 F* W7 D4 R# @7 j5 B: o+ l
# W( S+ `9 t3 o. i/ `! u for (int j = 0; j < 6000; j++)# e2 u" [& q0 a0 T- C) X
{4 h8 F4 U" q( H. a/ {, Z7 D L
std::generate(vec1.begin(), vec1.end(), []() {, ]& b! U' D* m! g; V! \
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;. y; @ Q0 r0 x4 i8 I
});
1 @3 Q9 b* |* I1 R. ^
- D7 f' R8 t" X; c3 k std::generate(vec2.begin(), vec2.end(), []() {4 h0 j$ C8 j R, P
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 P# ?. w* N4 @) I+ ]0 f( B });' w+ r. |9 f, U& n: {* J. N
1 m- q9 H: E) g x' Z* Q! T. e, _ for (size_t jj = 0; jj < vec1.size(); jj++)" n$ C( Y* W9 p& v( X! v$ q" W1 H
{& b" k/ ^$ k( D! u; i3 j
b1[jj] = vec1[jj];
/ }$ F# v; y$ v3 ]; C% n! f* u }
# ~$ c! J1 v! Z# p' t( `, E4 C3 B) W e
% \% |# j |; r0 z' ` for (size_t jj = 0; jj < vec2.size(); jj++)
. p5 ^8 i( ~6 s; x5 p/ ] {: b5 \: n0 n- a. j$ E1 g9 S
b2[jj] = vec2[jj];# ~% i& S4 q. v
}! x2 U( V# ~7 }# E1 Z1 z& p
/ b# K1 F) K+ h/ i
//Method - 1 N=100000 247s
0 |& }# f2 Z# ]9 v8 E //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);# P' @2 ~8 I) _: {
1 V! {- G& k* _' W" {
//Method - 2 N=100000 237s, U* e# H5 d* H
/*
* P6 K7 y7 j3 h$ z# ? for (int jj = 0; jj < N ; jj++)
# r! p( A7 d4 b! P( m; q( z {. R9 P% d. m r' X6 N- i# d% E! }
fresult += vec1[jj] * vec2[jj];$ L3 v8 |2 ?1 e" Z8 D
}
# v; I1 \: W! Z, I, K9 Z */0 v2 M* c1 e( M- d1 b, ` {
/ a3 p) u4 e7 V) A5 d //Method - 3 N=100000 204s
4 F4 M5 w; r: l' | /*( R7 D9 r2 }# j( X& _
for (int jj = 0; jj < N; jj++)3 b8 }/ _ N4 x5 g) G
{
( F" X1 g# t5 y5 z. D5 b* Y fresult += b1[jj] * b2[jj];3 N) D/ d H z8 k; `/ g+ r
}& S7 h5 ^ l4 D" {) \& c
*/) h' l4 p4 e& z- M1 G! i
1 v+ m! C$ F q8 j //Method - 4 202s; {# t4 T7 T! k/ k
/*3 W" ^: u& `, B0 Y, C4 @2 C8 r, R
for (int jj = 0; jj < N; jj++)9 {$ v0 ]0 b+ U% X% e
{
5 L* |1 {0 K/ {- ~
7 f9 X' o# S' K/ C }
/ ?; d5 H1 e: U# h) j8 l, o */5 u; l$ p) a- q: B% ^9 W
//comment out all methods, N=100000 202s
, h4 ?9 {/ G& z: N7 _6 s2 A }& G/ I6 \( n0 O2 A. z3 N
8 K; A6 s B3 O delete []b1;6 N, I0 L1 M; P2 H3 V2 Z9 v
delete []b2; ( C! X C4 y N2 W
|
|