TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 N; ^3 S. Y$ b! [ M
7 k# S8 b, u, ~& w7 F1 k理了理思路,重新做了一个测试。
: F t( \6 t& S. D做了两个 vector 和 两个 float *, 都长 100000
. B& v; j! Q* H- i4 ]9 k$ k外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
6 q0 G1 g }* ]% A! _6 `$ m F6 W; x% ]3 ^# U1 R1 R
内循环试了4种方法,
0 s: Q8 f6 ]1 R* V6 ~! v1. 直接调用 vector inner_product 247s
. {0 i( T, `# p9 ^; U9 L4 e2. vector 循环点乘累加 237s9 q4 v7 c, n2 h, G6 v
3. float * 循环点乘累加 204s$ _0 R+ Z6 L2 l; e
4. 空循环 100000 次 202s
4 I+ S' u0 A0 D' `/ U9 D t# G/ p& Z7 b/ ]% \
不做内循环 200s
% r2 S! G9 u$ {1 O F% `3 T2 i7 W5 i
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
0 X, u4 j4 l- N/ x% |5 k另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
( o/ Q: |2 J# {' Y
. ~- |3 L8 K! G' a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& V5 u3 q; \" _' L
P; [. H5 E: x* _# s(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
Z& Q% `$ s- G F
/ ~2 G4 x3 L0 q8 E$ b, d2 c std::vector < float > vec1(N);0 U* T1 q$ Z$ D$ T
std::vector < float > vec2(N);. a+ d) B% q4 `) L4 h
float* b1 = new float[N];: Z% p' [1 [3 E$ d6 N/ t6 x
float* b2 = new float[N];
& C( w: I; e' S0 f, O' r* \/ N* V/ v( p( l3 d: h/ U
for (int j = 0; j < 6000; j++)
5 Q+ M1 e# X4 L: }: i {
+ u, D9 u4 B9 l1 Z3 A std::generate(vec1.begin(), vec1.end(), []() {2 t4 z/ j( {2 |. g6 s& {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" x5 g( E/ t( |5 [
});% y+ A: G o% ], ~5 _: i, b0 c
( O4 e- y, b A; h0 M4 [
std::generate(vec2.begin(), vec2.end(), []() {" q0 g" b, {- K2 X1 _/ ~
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
/ `. _3 Q1 l- A/ ]- j; c8 Y, R- S });
7 d, a {! C0 j! {
. A0 T8 |' M4 e for (size_t jj = 0; jj < vec1.size(); jj++)& w2 Z+ S3 K8 C, l) q# n+ w
{" B4 z! e% T8 A8 ^2 D& r5 {
b1[jj] = vec1[jj];- w+ V! a! |4 |$ e& N5 v$ p
}2 p" o$ V* k B J l- O w2 X
2 v) z# K) I0 A! E for (size_t jj = 0; jj < vec2.size(); jj++)
; i4 ?1 P9 H; j. M: N' K* T5 q {" J- c4 z' B- ]$ Q% \/ W
b2[jj] = vec2[jj];# z% p2 f$ z8 r9 Q2 E. r
}
5 P0 q, j7 [- g W( E; X' a' [1 \3 ?: p; I1 n3 S1 _4 V1 F& U
//Method - 1 N=100000 247s 9 c+ t6 N4 ?/ [2 x
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
) H9 O3 q( c5 z
; X6 y5 @/ h7 f7 E, B- b //Method - 2 N=100000 237s" y4 ~7 Y5 l4 @$ j- f) G3 U
/*. t, y; L+ P+ [0 @
for (int jj = 0; jj < N ; jj++)
% t9 {: j# D! W {6 P! C0 ~0 d. H. T5 h1 o
fresult += vec1[jj] * vec2[jj];+ M: d7 r( n2 r7 w
}
( H! j2 x6 \: Q' m" ]( c0 z! o0 C! N, U */* C( x8 M3 ^ M, k9 U- Z+ x
3 o! P8 L4 @0 f! V( w' g //Method - 3 N=100000 204s
0 h* T4 |' e% ?' {7 ^+ h/ o% @. E5 q /*
- O& L: a' S* F3 P+ q for (int jj = 0; jj < N; jj++)
+ r! z+ ^3 C6 Q& X' ?+ V: e0 E1 d {
V4 c( j" n4 h* R, y fresult += b1[jj] * b2[jj];
5 r8 h- ]/ I$ A }9 I$ f- J; q9 q! S, u
*/
: I& Q* i. X# U3 j; Z" {0 i+ h. F5 h
//Method - 4 202s
# X4 j% f: y2 f) Z; K0 w /*! d8 I. U) r' E6 v- n' j
for (int jj = 0; jj < N; jj++)
$ t9 V6 [5 j$ ]" S {4 o* c+ p( J3 @
# M' ~% t. r d5 E }
" v4 z, R+ `4 Q! h */# b8 V6 r: [9 w O
//comment out all methods, N=100000 202s
) f8 N6 C0 E1 [; \! d% q# o; E }
# v5 |# T6 S3 N- S; {8 }* {& k) B/ k" d; N2 f" [
delete []b1;9 S% U/ D% ^4 b7 o
delete []b2;
' H! X2 `- N& M4 d+ D2 @! L7 D1 H |
|