TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ' \3 d9 M" e: R8 d P, b
% G; K# @2 A; g6 H6 r) F" X% R
理了理思路,重新做了一个测试。- D* O" w& P' F
做了两个 vector 和 两个 float *, 都长 100000
# l% e& A: u. t: D外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.* K( `5 H# O" R; V
5 t4 j8 g- e" o( u8 E& n3 j# D- K# p内循环试了4种方法,5 _) U+ f$ c, Z6 L' y7 l
1. 直接调用 vector inner_product 247s
3 }# H: Q/ m, R6 ^( w" J2. vector 循环点乘累加 237s* D1 }' ?$ B o
3. float * 循环点乘累加 204s
( S+ Z8 n9 J9 ^4 z4. 空循环 100000 次 202s: B W/ e( ]% U/ m1 t$ m
; F% y" }5 C: }1 e. ~) ^1 y1 v: T. z
不做内循环 200s
7 e1 p4 g0 O1 j0 W
/ |8 H: V/ R& r% Y, i# H, _" _你昨天说的对,内循环本身占比是很小的,大头在其他处理。( |- z3 I' i' o) o) E% e ?& [( v7 Q- Q
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ K) d3 u V- O! b8 b
* t2 {& ^5 {+ U& }0 ] M
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ A5 N1 m7 [! q5 z1 r$ e* E
+ n1 l" n* }2 `) ~# G
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL) I3 y8 J+ D+ o% X- j7 N- L
$ y+ \, i# s5 W n2 W7 c: j9 x
std::vector < float > vec1(N);
+ A. F$ ^, @7 g4 l+ F/ s3 [) } std::vector < float > vec2(N);2 P0 ?% k" I: {6 g
float* b1 = new float[N];
6 s+ V" s! L( D. Y' u" N float* b2 = new float[N];
/ h" x9 Y% M K+ y5 U5 u: l8 P+ O! j K+ G% S
for (int j = 0; j < 6000; j++)
' n$ j% m! V5 X5 f {6 E1 M6 D& `! x+ s- ~
std::generate(vec1.begin(), vec1.end(), []() {; B+ t$ C6 w5 N/ F1 I7 D$ i
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! h6 p3 M1 d9 K' y! O0 u
});
& R4 E1 h7 P3 x! M1 y; j j1 j" C1 u) B. h7 U
std::generate(vec2.begin(), vec2.end(), []() {5 k0 D2 o5 W! N" {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
, V; N0 z$ \# z/ ]/ D# C });
" M. ~4 q% j! S5 q- s. [+ e* I& y* y
for (size_t jj = 0; jj < vec1.size(); jj++)
. f; v8 i& n, |8 I$ ^0 G {
& d4 @/ D% E4 J, H6 z- j b1[jj] = vec1[jj];
3 S& W `. h" N. i3 N* r }$ C! h" D6 F8 W5 w
, v' d% P/ a5 c' O2 S0 O! d for (size_t jj = 0; jj < vec2.size(); jj++)
" {# F0 p) X! [# V& h) X. e {9 c3 j- U6 A; p2 C* t
b2[jj] = vec2[jj];
, d; A6 [$ t) ^) W }6 g# ~! u8 O' d0 c+ y; V
3 n1 }) v4 z- {0 c3 t2 \% K; F //Method - 1 N=100000 247s 1 b6 R+ Q! u! T
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* }0 w6 w+ I. T9 S, y
5 w# e1 t* E7 A; q6 }; ^8 t; @ //Method - 2 N=100000 237s$ k; q4 m, g5 ^4 i) W8 i) |5 B) \5 Z
/*
" F V2 |8 F6 _4 [& ` for (int jj = 0; jj < N ; jj++), d4 x, ?; b* K* @! a1 _
{# `3 {& K+ m4 ~
fresult += vec1[jj] * vec2[jj];
& \+ L" H+ s' U# }& u5 a% | }
* V: s4 z2 {: s4 e */0 m8 V3 ^9 X: H4 b# z- G( Y
# s% ]6 C5 U# ~3 s //Method - 3 N=100000 204s
. ^9 C' l/ r: [1 b /*
9 o3 W- G. E M9 S+ \7 ` for (int jj = 0; jj < N; jj++)1 J# t. T, H+ ~/ V+ ~
{- v0 |: i6 \# `- b( U+ L. G# ?
fresult += b1[jj] * b2[jj];
O2 R/ C7 O$ g8 w! t6 q, p }- N" P$ f( J+ S; v/ T5 k
*/# ?, ?4 y+ ^' ^2 m2 t
+ O: ^/ r* Q; K
//Method - 4 202s: B& H4 G6 L4 l4 J2 }( K% m0 k
/*
# H' f/ c2 u3 D+ }' o, _ for (int jj = 0; jj < N; jj++)3 I5 m. W# e$ C4 ]/ N" u3 e
{
, J- r7 S% B$ ?4 c
8 j' r [1 W3 B9 ]2 H }
$ \" j# m0 Q# G# N */; U7 c9 i S7 L* b7 \
//comment out all methods, N=100000 202s
% {5 O' ?! X* \' ^ }# P$ f' o+ g4 z2 f- `+ _
3 J z: Y5 B/ N) r
delete []b1;
0 x& F. u3 p0 ^& s delete []b2; 2 e3 u4 R- r9 S, _7 o4 e
|
|