TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 2 F0 t B+ x2 q) a7 e" _
4 @3 }6 E7 R4 D! E
理了理思路,重新做了一个测试。
5 S" ^% b$ m$ l" d8 d; o7 x做了两个 vector 和 两个 float *, 都长 1000006 B* X/ p" X4 c1 b
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 L- g$ \' m0 z# q+ t. C
/ B7 G Y. I& O7 X" t5 w7 b
内循环试了4种方法,1 p/ i! @" P$ v+ F
1. 直接调用 vector inner_product 247s * s) J7 @. d0 w: r+ Z% j
2. vector 循环点乘累加 237s
: U( d( q3 Z; D8 L0 U% q3. float * 循环点乘累加 204s/ a8 ^% ~7 X' y/ p! k7 n6 p) ^$ N+ c+ \' B3 H
4. 空循环 100000 次 202s
5 j' u- y0 {: [9 D Y8 ]* S) M2 O- i$ r7 d" d( ] [0 P
不做内循环 200s, V2 E" N4 b9 u2 C7 ~4 R# P
" D4 D" l6 B- o5 O* d
你昨天说的对,内循环本身占比是很小的,大头在其他处理。8 Y8 u% e L% j- {' N1 \- Z9 p7 w2 E2 c
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
+ |0 d V8 {9 R4 j, }3 G! t I+ U/ j8 y( [
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ Z) T! U+ p# n8 e; R G
7 W* H/ v' d {- ?2 b/ Z- Z2 F
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
0 P& [# f' Q0 ~' t0 z& l5 U, R4 w- t6 R4 n* h! v Y" D
std::vector < float > vec1(N);/ V4 w4 Z% b6 x7 }3 h9 b
std::vector < float > vec2(N);
q) }8 D% R# w, U6 @* ? float* b1 = new float[N];/ \+ o2 _# h6 c% D
float* b2 = new float[N];; I h3 i4 x) B& z/ Y3 ?8 A8 E
! j# G# D* H6 q for (int j = 0; j < 6000; j++)
) u- i0 q; W: t' k( C' o: x9 \ {
; a+ P" Q1 ^+ _' }1 ]: `7 b! Q; \ std::generate(vec1.begin(), vec1.end(), []() {5 W7 V y. H. j% J% R1 d
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 P$ U" n) i2 y
});
U$ r' `( c& C4 `$ o3 V l$ j5 L
9 ]7 v5 H7 y$ N std::generate(vec2.begin(), vec2.end(), []() {: L# [9 P! t! Z- p2 k5 P0 e4 y ~
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
2 K9 I1 W2 E2 j7 z" {+ r5 X$ _ });" G- _- g9 y/ s0 z1 l9 \2 C! e
. |2 m! Q+ j. X/ _/ _7 v9 Y! B for (size_t jj = 0; jj < vec1.size(); jj++)5 V* k6 x9 e M' Q% `+ I) [
{
4 t: y. I9 Y1 o& j4 k b1[jj] = vec1[jj];
: p9 A6 W1 y4 i' n* @) \. r: T }
% `/ L$ B3 h$ o& l' N- @/ q& K$ H& I3 k/ b, @" [" I
for (size_t jj = 0; jj < vec2.size(); jj++)& o5 h) j" ?9 n/ A2 I
{. z" s! R- \- R( q; d6 W* v; y' U
b2[jj] = vec2[jj];
; V+ {* A* q0 x8 C! Z }9 X. e% K0 r8 W8 _( C
+ C/ W% C. b u: t! b' m- N //Method - 1 N=100000 247s
; k2 F' i; K, c& T //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
% U" F# y0 h; f$ W! i# ]4 N
' a; w2 W( Z8 M* V# Y //Method - 2 N=100000 237s" s% w) ~, H/ [0 o% c: D {) L
/*! K( T* ^9 l& B0 Z
for (int jj = 0; jj < N ; jj++)
; ~* l0 j2 `' ]0 e; ` {$ q& [1 t" }* T) u
fresult += vec1[jj] * vec2[jj];7 I& H* ~- A. Q
}
0 f) g& z% ]- l */
+ u1 ^8 t O* o7 M7 P: Q ' E5 u+ i- k$ j2 v. _
//Method - 3 N=100000 204s3 A' u0 E; d' E& I" x
/*# u$ o% I/ ?9 ~, O0 b6 S; a2 }
for (int jj = 0; jj < N; jj++)
8 i/ N! M7 Z2 O6 R& k* K0 b& ?9 b {8 x8 e: B+ m' e: }6 Y k. I( O
fresult += b1[jj] * b2[jj];
/ _ }9 F% l' P7 I }
7 ?# w1 a: m0 D; Y5 \5 f */- W% |# R4 z/ b3 b2 _% t+ O7 @# A
. {0 g, W! o8 a
//Method - 4 202s
4 E. X) b3 x, ^0 R6 H: v* \ /*
2 z6 Y/ |8 D$ T9 I for (int jj = 0; jj < N; jj++)
/ |3 W3 u0 y' Z, z3 w4 S( O6 ]# _8 _ {
, X% h4 [6 N% F4 u% P, N
; J2 V# N1 n* Z& z6 z }( ^+ h2 y0 Z; j. F" A
*/1 F8 c, f+ P$ k' l7 r9 J
//comment out all methods, N=100000 202s
' A9 T2 _9 G: G9 l* c }
' Z# F2 F* U l, u7 c7 s p p/ a N6 N
delete []b1;* q' v4 [# Q% @& `# Q
delete []b2; ' u! t, g/ P# M) w. P8 M
|
|