TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
( X, [- T# e s; ^! R
2 A5 b! A t: Q理了理思路,重新做了一个测试。
E3 r3 }& ^8 U做了两个 vector 和 两个 float *, 都长 100000$ \- o* y. S# c! G3 Z: e
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
2 e# z7 F* r0 Y
3 s- P) a6 I. F! M! L+ f6 P7 B2 c' U内循环试了4种方法,* O* D, t+ O! j Y8 y; P% |
1. 直接调用 vector inner_product 247s
# p$ u' B4 q7 z+ @2. vector 循环点乘累加 237s
5 g- m2 ~1 H* `1 v" i3. float * 循环点乘累加 204s
4 p+ @# L( T# Z4 I+ _ N3 w- w4. 空循环 100000 次 202s3 i6 O9 B. ?9 d
0 g1 C/ R$ c1 D/ O5 M2 o# p3 f不做内循环 200s
4 H+ o4 `1 n0 `, }- H
3 o; u# c; y$ ^" b+ }8 e) }你昨天说的对,内循环本身占比是很小的,大头在其他处理。" W" B. @/ y6 P' i/ V: N
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
3 G' j( j- N/ D, \4 P
; W) D. s) B7 O5 Z& \+ H至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
8 `; j6 F) l4 m4 U9 @
. k* [& W: t! S" B" O(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
6 L, O. i% W- |8 |
! R q3 s ]$ c3 \( ]0 c std::vector < float > vec1(N);, Q% P8 U8 w+ n5 M8 R. ~4 G7 S
std::vector < float > vec2(N);
" X i$ o- h8 u! ^- ?9 Z float* b1 = new float[N];1 P9 ?0 |: u3 H* R; k
float* b2 = new float[N];
( l" {* ?) O! X4 ~; e0 ?+ X; _1 ?6 @" ?6 F0 n1 }
for (int j = 0; j < 6000; j++)7 C7 P* I8 M% K" B! J- e
{5 K) v4 w) h0 z, @; i, M, P: v
std::generate(vec1.begin(), vec1.end(), []() {0 M% Y4 U! J! w- @0 X1 m' M$ T
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
- Z8 D2 ?2 h- ^- q8 U });' B1 g: g0 ?2 k2 u) o
8 o: v2 R. d3 l2 J5 U6 B, [
std::generate(vec2.begin(), vec2.end(), []() {
2 L+ o- F4 [1 [8 Q# ?; U8 V return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;; q2 [4 ]* r! F
});6 k1 Z4 _! G# \/ G2 E2 D. V' v
3 @5 z( ] U. l# }: T9 V- q
for (size_t jj = 0; jj < vec1.size(); jj++)
8 |3 E6 s. x9 Y {
! ]. r, J) r e! x b1[jj] = vec1[jj];- w1 W; |! c! N: O
}7 [! O" u) \/ Q8 G1 Z
5 p! t* h ]( R8 w6 p9 O: t
for (size_t jj = 0; jj < vec2.size(); jj++)9 O! f$ }' V, G( y5 C, a( l5 u# F% Z
{. J4 ? B q7 O" G4 ]
b2[jj] = vec2[jj];0 a' q6 b: y4 U2 h$ s7 \: C
}$ v; e1 x3 d0 h+ Q
: r2 B ? N9 \! g //Method - 1 N=100000 247s
% ^, V6 {0 H- D k //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
4 V+ C7 f7 V- @" [+ O0 m 4 q- F8 o, V* M9 L7 A: j
//Method - 2 N=100000 237s7 X4 T9 ]- q5 o. Z9 u
/*
8 t* }- K4 W1 Y& `2 C. o& e for (int jj = 0; jj < N ; jj++)" }) j/ f% B/ H6 t! [8 l
{1 ]1 c4 C( a% K! Y
fresult += vec1[jj] * vec2[jj];/ b0 J5 L) F: U
}
6 G" p: S- k3 W! l5 _ */
, S+ o6 j# O" j( t7 K. D2 K4 ?
( q2 \; L! f& E/ o: O' |% `5 v //Method - 3 N=100000 204s3 u- A+ ?( i# N' c& _; s" G
/*
& R( q) p6 F$ R3 l5 n9 T for (int jj = 0; jj < N; jj++)
0 @0 V, C$ j( g s2 W6 B {7 R$ |2 S; n* X2 `9 g G
fresult += b1[jj] * b2[jj];7 \' u& U1 g0 b0 F: \- C
}8 q7 a @+ F( I [' \1 J
*/
9 T, L6 a% M2 S/ A7 P
: ?+ ]: r+ @5 D+ C //Method - 4 202s
0 r$ I8 B1 P/ i9 ] u, s2 t /*
# O2 \' d8 K) J w$ Y- A5 e2 \ for (int jj = 0; jj < N; jj++)7 m4 z+ r+ |& E% Q f9 e& I
{
6 F/ f' r+ }1 N6 d7 Y# Y 7 r& Y7 ~, ^' `$ e
}/ c) Q' Y" e F4 A5 O
*/
3 u& N. I7 h, `/ K% y //comment out all methods, N=100000 202s ; u7 F0 j9 u. q% W- Y* Y+ E" j1 P
}1 `: z- d: I7 O5 F1 f
2 G9 ~6 F0 @0 H7 w/ @
delete []b1;9 {' i9 M3 c% x- x
delete []b2; & e! o* F& i* b2 E% R5 r
|
|