TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - U' ]7 f+ m' P0 n* Y/ t, B# s
" }/ i# P+ C0 X理了理思路,重新做了一个测试。
. Y% S! l7 M, B# n7 C( ~做了两个 vector 和 两个 float *, 都长 100000
& K, v7 `/ c# F6 J) t# W外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' l3 u% ~ ]- Y- P. L
# F' R! m; u2 p& n3 u4 u内循环试了4种方法,: G. ~' Z( a$ ?9 w, q. |8 y/ Z
1. 直接调用 vector inner_product 247s : N1 x% `. V% d. X+ s6 ]
2. vector 循环点乘累加 237s
' |- I- e" E, @2 m5 t0 m6 Z7 A; M3. float * 循环点乘累加 204s/ Y$ ~: Y4 @; w9 H: S" r
4. 空循环 100000 次 202s
$ l. K& a) l- ^0 ?! q7 H' ^$ A1 p
' z6 x- |5 Q- C- _+ |不做内循环 200s
1 G6 j- j& N- V, y: O3 n- J" K6 z+ k' j, u# q: \. @
你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 ^: a2 C- d7 O, |2 T* A1 s
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。9 q* y1 X" y' X4 @$ A" e; e
2 S9 U) ?% i' [& R4 B3 U至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)- z8 \- O3 j: Y0 m- W+ |3 d
) ?4 L1 C/ \; R(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)4 a: ^& B' P5 n3 ?
4 a9 [8 F" p! N! M4 n/ ]8 P
std::vector < float > vec1(N);- E; V2 V2 R; o9 F* _: a
std::vector < float > vec2(N);
/ Z9 X6 \. m h% w8 x1 V" h( w float* b1 = new float[N];' V/ b1 G! h/ }6 N& T: w% f
float* b2 = new float[N];% ^; H; ?; d6 Y1 P( T; y
8 f# u: U' f0 F& J3 z
for (int j = 0; j < 6000; j++)
$ J+ V9 I7 q, P# o4 b5 v) V$ x {3 l, e: l! S0 O% U4 [
std::generate(vec1.begin(), vec1.end(), []() {
# m: \7 X) [3 y1 a/ c return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;9 F0 v" r0 j- m6 K
});7 E N: _. N4 I
~, a* i! k. \1 v- E% ~ std::generate(vec2.begin(), vec2.end(), []() {5 g7 @8 Y6 t4 d9 @7 u4 H- K" C% R
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;( X4 ^6 O0 W5 {% U5 B
});1 m; c6 k( x4 l3 Q6 I- p
2 O4 [/ i; s; u$ \, t for (size_t jj = 0; jj < vec1.size(); jj++)5 S+ p3 X \0 l) h7 j7 P, @) e
{
) ?7 C+ \7 E# I3 L$ J& B b1[jj] = vec1[jj];
7 p+ M. ~" C6 ]' H }5 A2 ?: }; Q7 i$ D7 V H/ P+ X
2 w. U$ j+ o' x8 i/ q% C$ z for (size_t jj = 0; jj < vec2.size(); jj++)& H, J3 K& C# x/ s& H# c+ w7 M
{+ k0 W5 q. @# v% ]; u S
b2[jj] = vec2[jj];- `$ W) v [# h1 w
}
- m. P8 \+ g( r- V, A v1 L& y4 Y [4 N7 G' M2 b3 W9 _0 t. G6 _
//Method - 1 N=100000 247s
! D+ U0 h* Y$ f3 I( i C //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. Y; A5 @% j8 m' B) b( i7 {" H% i : d5 ^: x" s: a1 O: v. [! W4 t8 f) d
//Method - 2 N=100000 237s
: c; Q3 j2 x% M8 f& J! q; u /*3 W; q" S) l4 ]+ |: J, \
for (int jj = 0; jj < N ; jj++)
, w- L3 y* i9 d! O! s. U& a& o {
" _5 m1 Q: G+ y b. G% G& F9 ^ fresult += vec1[jj] * vec2[jj];
! N3 Y% D; D3 G }
/ D$ p# c: D0 P% {, W9 `! E */5 y* p3 K" `+ }$ R
7 N+ ?: a9 V+ t' O, @* i. c
//Method - 3 N=100000 204s8 a" O! @( M( n1 W; L" W# I# S" e
/*
# N* z* d$ W! m$ X9 X for (int jj = 0; jj < N; jj++)% @3 {) t6 d% m7 S4 h
{
3 L' W3 w% L' Q$ C0 R/ G fresult += b1[jj] * b2[jj];
5 s8 X, D; [- Y6 [; @7 t }
+ _5 f$ [% {. B, k) w9 E7 Q( e */
1 @( T9 E! P, l) `
' S" t2 o9 i$ b- w! V: X //Method - 4 202s; T& b2 Z0 J3 d4 k$ Y$ a
/*! k6 }1 t! M; j- v( d
for (int jj = 0; jj < N; jj++)+ K' ^' Q0 i5 L/ I$ U
{) N! i2 ?; Y) x7 o& y
/ ~3 O2 Q# \ j/ W
}& Y+ j. N" p8 Q* K" L" R
*/
2 s% n7 p4 T& d$ Y7 E4 c4 \* n //comment out all methods, N=100000 202s
. r5 k. V3 O& X8 \) F }
- U) e$ I. o" l! N* E- L \* t
. t! r1 D- i, u delete []b1;
6 G9 o4 ?& L! Q/ ^- i* {+ m delete []b2;
% m- y) Q2 {+ t! e4 t |
|