TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ; P `. k3 C/ v" ~4 ~1 [4 E% h
. o0 `8 B) z5 \; Q& U理了理思路,重新做了一个测试。
+ o. F5 `* Z, b8 P做了两个 vector 和 两个 float *, 都长 1000004 ^' |# V* \2 x# m! A9 s6 n
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' }1 X7 @7 B% p( v: U$ y( B I" y5 M- R7 {) m
内循环试了4种方法,. p" W* @: J7 {9 m
1. 直接调用 vector inner_product 247s
, }) j$ |. X: b2 M2. vector 循环点乘累加 237s4 X& L( f% H2 n% T/ k
3. float * 循环点乘累加 204s) T" k7 R; j" g& k/ [
4. 空循环 100000 次 202s
7 |9 w; H/ u4 z: i0 `' A8 E4 E3 U; @
9 \" W- w; n* ~' w4 }3 v8 q不做内循环 200s8 Y( \- j3 a# _" \5 G% G
* w5 p! y( r2 I; y
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
3 q" [* G [5 f3 _" l* C. C* N+ i |另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
8 Z- m+ b/ r) d# j I t
4 K0 ?1 e# R; m# |, b/ v( N5 ^至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
. z" ]5 S! S- D$ S! q( c: J( V. y2 x/ F( r, Z8 l
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL). L* \) b1 o0 ?
; j4 ?( i# `( R: z6 Y# @
std::vector < float > vec1(N);( u$ `" }3 b: ^9 a, k
std::vector < float > vec2(N);
# W/ ] |3 ^9 q G# `1 D9 { float* b1 = new float[N];+ J( s& E- {" I
float* b2 = new float[N];
$ }/ w4 \: b0 g/ {- H+ u: n6 G' Q$ Y$ B' z
for (int j = 0; j < 6000; j++)- T* U( w% S. R. Z% n1 g' N
{9 i5 [9 | v, L
std::generate(vec1.begin(), vec1.end(), []() {
8 y( i! [8 K; ]4 h6 y7 S return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;: p* Y$ C2 k8 u% d4 } U! D
});
+ k6 z3 r% b8 l9 i4 c5 V6 J) Q1 d1 w
std::generate(vec2.begin(), vec2.end(), []() {9 m# @# ?6 X5 ?2 S5 G9 v+ s7 R
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
8 j. g# x' i" d# K: U% b* N* i });- k7 Y8 B* H& G' x, a
) u- N" D/ _+ S0 |0 N
for (size_t jj = 0; jj < vec1.size(); jj++)
% ?, y+ p4 P' c* b* X0 M; l- O {
9 _+ n: _& h5 F5 V( | b1[jj] = vec1[jj];( } R( _9 E0 {& f% h
}
: j' n) E( ]5 k7 l( O$ a- T. y# M# N- z
for (size_t jj = 0; jj < vec2.size(); jj++)7 ~# L) m" u; q# \" R5 t
{
. n: s; [7 f5 ] b2[jj] = vec2[jj];7 l) A9 S8 q& P. u- M3 P9 S
}
% F2 f/ _& e: [
- }5 O# l9 J6 k3 ]1 b' L) m | //Method - 1 N=100000 247s * k# B9 z6 y( b, Z: h6 j
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ O# F2 `' Z" b
; `: R* o6 O$ n- \ //Method - 2 N=100000 237s
0 I- m" j K, D /*
" R; M& O, D! L5 l; Y6 T3 T$ m0 { for (int jj = 0; jj < N ; jj++)4 e+ k# h- o5 Z$ L0 W
{
' `1 }2 k% ?, U p% n, _5 p! P" C fresult += vec1[jj] * vec2[jj];; V+ f0 r/ j2 l; c3 b
}
6 _3 W; H$ K3 K- o. w$ M */0 p" x3 m; C* s# K/ u1 b5 r
1 A+ k5 d5 a9 u& y! z
//Method - 3 N=100000 204s
# U. b* ?* f5 k2 u% L3 | /*$ Y: a5 M D& S" q
for (int jj = 0; jj < N; jj++)
% r/ I8 H) {5 O5 ~ {
# Y1 _8 D2 B# J fresult += b1[jj] * b2[jj];- w8 |' Q F: _- q. N) O
}3 S" p: [: L {! u C3 N, m* x
*/) i, k. f. j8 Z
) I9 r9 J! Z+ E4 \) B
//Method - 4 202s: b* }/ l' y }1 `+ ]" B
/*
9 v7 t6 n' N" ~. [3 ~$ Z$ E for (int jj = 0; jj < N; jj++)& X; T2 V. ?0 t+ ]" x5 G/ w# r% w, E
{
4 j( ~2 f* D7 P) q- e& k
, E- A4 P& O8 n }; {% n- u4 Z3 Q2 B* c% I- h! o
*/2 @+ B0 y. [0 ~* b) S4 ?
//comment out all methods, N=100000 202s
5 L: p; V, D8 p/ t }$ u. I+ _+ l& e% Y- k8 @5 q1 b
, }; a) H; g" u0 I! w delete []b1;3 h5 I: Q j8 E2 l- F! c# m
delete []b2;
7 w! i# F: M! e3 R |
|