TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ' ~6 w5 M+ R3 s+ d! w; ~9 r& f
- j/ _+ k' ~0 u5 g' E! R理了理思路,重新做了一个测试。" E2 p% N. {% Z& e1 }: u4 p0 B
做了两个 vector 和 两个 float *, 都长 100000' G) P3 t+ F I( }; c
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
* p2 [( Y5 ^& o7 f m7 _. t2 ]( b& F+ Y; o" H/ X, l- L
内循环试了4种方法,! Q, H E! x! C5 b" t/ J
1. 直接调用 vector inner_product 247s / }6 |# e, e T! p; H/ Q- P! ^- y
2. vector 循环点乘累加 237s" J4 I# w: s Z5 a: m9 N( V1 `
3. float * 循环点乘累加 204s
6 h, n# p# f$ o8 M# q3 e4. 空循环 100000 次 202s
5 O z4 S/ G! G* f* z* a3 Y% ]" C; P0 Y% x- X8 D3 ]9 H
不做内循环 200s
: `2 `; L: l2 @- E- H4 \" _ n) C8 p2 b. M
你昨天说的对,内循环本身占比是很小的,大头在其他处理。 ~4 N4 n" j0 J: F
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
) V: t/ G# X* m5 U* o" K& J4 G: d5 w1 \
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ i4 g2 R D: n* V% V0 P5 F
- [- n5 M) ?% I+ H1 U
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)0 {' r$ M' f7 `2 o
% i; L: `: e0 g+ s9 B' B std::vector < float > vec1(N);
; d( K& G. m. T2 I; k7 i$ O" F std::vector < float > vec2(N);
* [: O: ^6 o7 C) \; }3 u float* b1 = new float[N];7 E3 F9 `/ `$ K; f t4 W" z7 Z
float* b2 = new float[N];* R, b D: m9 Q& H& {5 r9 q
$ _/ e6 b. t- t! l7 T' r
for (int j = 0; j < 6000; j++)# Y* Q$ @/ \. q" O
{) l2 {7 Y4 J x& d, u3 \7 \
std::generate(vec1.begin(), vec1.end(), []() {
5 Z; r% r8 ^- {) r' Y' j7 p return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
4 U6 Z5 x3 b6 x8 O });8 d* p* X$ o) O+ Q) U8 M% O* w7 b9 X) ~
4 l# O* m# ` P std::generate(vec2.begin(), vec2.end(), []() {
( F; k: N! ]3 ^0 B9 W) N# R return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
/ H1 ~: G' a6 A4 @# E# H' J });
+ `% ~# z! S0 B: t" {7 N! q0 J# I5 V' P: \- D/ S' m- K* V1 e2 ?: z
for (size_t jj = 0; jj < vec1.size(); jj++)' I" [2 B* l) ?, J, `# c
{
) h% w" r7 Q. ^) [ b1[jj] = vec1[jj];5 a7 v4 O3 b1 v2 w# N
}
) L1 H5 h& T) k0 H$ a1 Q2 F
; H! @" Q4 W- O for (size_t jj = 0; jj < vec2.size(); jj++)6 Y% t% T9 ?8 }6 S
{
1 k$ O7 k5 {5 u b2[jj] = vec2[jj];
4 \. h v' U& X( L3 N/ h6 t }
4 a% s5 q/ \0 F
9 T2 B" H' z5 t3 r //Method - 1 N=100000 247s
+ {2 \& D- i5 k //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
( [$ i: n0 L5 D# K. {& A$ u" l ! `; X! _% r* s X
//Method - 2 N=100000 237s
8 P1 p( l9 d: t& |. H /*0 ]3 {6 l& D4 ]1 g
for (int jj = 0; jj < N ; jj++)! F! {( Q3 b7 u! h2 X
{
( _. z0 W/ J5 A, r: }: W9 n: W8 R fresult += vec1[jj] * vec2[jj];/ b' r( J% n: x; v) R% {3 P
}
2 S$ c/ l" }& X$ b, I0 ^! v */
( @/ B6 |! E. j$ h1 T, Z! a3 t: z 8 g1 T3 L8 T; i& R
//Method - 3 N=100000 204s
8 H. j( x/ b# q$ L/ F( S /*7 C: h5 o6 d" T& W
for (int jj = 0; jj < N; jj++)
3 P/ {* G$ Y/ \$ L9 {, J {
* A* Q. ~/ n9 f* [3 D2 I fresult += b1[jj] * b2[jj];
+ Q5 M3 R6 J$ B u9 y/ Z }
% ~; [3 n4 }; Z' D. Y */
; A. |% [8 }& a( D, v) R' U \* P. G/ I
//Method - 4 202s1 I" V7 Z) b t& u, {5 w
/*
8 s* o8 m2 d' e1 x( O7 |1 w/ m9 J5 W for (int jj = 0; jj < N; jj++)8 B' V0 N1 P0 e+ a
{
3 }; j; S# m; W: Q3 S
6 p2 A4 w) L) X1 t1 {: f6 u+ q& Q }
) t; m: `) p/ ?0 X */2 ]' Q! k: `, b5 i
//comment out all methods, N=100000 202s & }0 f: f* E, l0 ]& V6 F
}
. G8 U$ E* \! @% P+ K6 m& a/ o' i; Z8 I2 }+ j. l/ e, W
delete []b1;
# T! c, z( |* @* ?* K9 t delete []b2; 5 u) `, n: |0 C! Y9 U; M' I0 c* m- Y9 |
|
|