TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
K% q+ z' V5 U8 I/ y7 {& |
+ W4 x$ d$ B+ t0 C2 f' F3 L理了理思路,重新做了一个测试。
! N4 h4 p" O/ h8 _. }8 P7 V5 K做了两个 vector 和 两个 float *, 都长 100000
/ ^& [" X6 y3 p( G Z$ k外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." W- v$ z/ b z' ]% F' x+ { o9 o( Z
3 y% [" _0 B X! p/ ~; g
内循环试了4种方法,
7 p1 u* U2 P' B4 Z/ B1. 直接调用 vector inner_product 247s
3 j) J& c' f- N! I1 v$ I6 o2. vector 循环点乘累加 237s
3 R* V3 [: [1 e" V8 `3. float * 循环点乘累加 204s& w* Y- O9 n, Q( U3 {
4. 空循环 100000 次 202s
6 {- Z$ z+ l! x$ E1 ^$ i) k, M! m/ [, L0 D# \
不做内循环 200s
\3 ~7 z# d2 }5 P1 l* K
2 o, ]2 M0 D' F' H M4 v9 T4 a你昨天说的对,内循环本身占比是很小的,大头在其他处理。
, X4 t% o/ y& M0 x1 y% K$ M另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
2 S' G; ^& j& x1 u3 \5 `
; t" I* M" h+ f至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 E2 ?) y6 o4 u6 G/ ?; J
1 p' z. w' x* [9 s$ d: P7 z! E
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
$ T8 b! ^* w$ ~3 n+ [
3 C9 y$ K! f( m1 f std::vector < float > vec1(N);* C3 l- u: O/ h5 A7 N7 c% h' s/ s
std::vector < float > vec2(N);
: r; c5 N( f$ W& F float* b1 = new float[N];
$ ]( F7 s9 y7 y' q) N. d float* b2 = new float[N];
" W9 \& e# \' P& J3 k ?, T. f- a7 J1 S9 u% u. w6 e
for (int j = 0; j < 6000; j++)1 @4 h7 f' h3 n0 S4 j6 M
{- R) V6 `& ~+ V, t& k+ c: b
std::generate(vec1.begin(), vec1.end(), []() {
& Z) E7 M) F) \6 y9 O8 ~9 v return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ o4 l6 Y: U' ^/ D8 i3 e
});) W' e* K( K+ G* u3 O
, |& O- X6 V7 S. Q5 L
std::generate(vec2.begin(), vec2.end(), []() {
2 h9 H) ~* j2 R4 }; g; G return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;1 H7 }0 }4 |1 P+ Y' }: `5 Y/ I: F
});
: U9 v) [% F( P$ C% z/ F/ i' [
for (size_t jj = 0; jj < vec1.size(); jj++)
# R% V& R+ ~; S" Z# l {
0 j* i* I8 V! \$ ?/ P b1[jj] = vec1[jj];
6 _% f( ?4 U; c5 U" ^7 O2 J0 P }
' i' F5 D& z6 ~; p8 R, M: H# R/ }! C5 L C3 |/ I5 J
for (size_t jj = 0; jj < vec2.size(); jj++)2 S) G; G+ C9 u3 p
{# I `6 g9 x/ t# Q* B I+ v
b2[jj] = vec2[jj];) R" q/ \& a$ `9 a+ s5 L# h! L2 G
}3 v7 x- {) L1 ]& O3 R
9 J6 g9 q- [' m8 U //Method - 1 N=100000 247s - o! f B) N+ q& j
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);2 T- H& |- q! l+ D! A( v
( G/ ]: ^1 U2 l6 y O1 E
//Method - 2 N=100000 237s$ y8 Z) s0 _ h
/*
8 { c* t) A0 f( a. F, g for (int jj = 0; jj < N ; jj++), S3 f1 T1 |( {6 {1 x
{
( }- s/ T2 h B, h' o. i& _1 @ fresult += vec1[jj] * vec2[jj];
* j# n. A. f5 h }. ?2 }/ p: d$ Y( P( U. z4 R
*/( U% N' Y% [3 a2 }
* M3 X' A5 s0 r q //Method - 3 N=100000 204s' P$ [- {3 Z3 }" a& d o
/*
" _( ?, w' T$ r' g for (int jj = 0; jj < N; jj++)
8 r) y$ z8 y( t {
3 Y: D. p6 M* ]7 L fresult += b1[jj] * b2[jj];
- ?9 L2 z% H9 t6 \ }. i* Y& h2 W. d' f4 k
*/( k+ M- \# N2 ]# L
3 o5 n/ ^- i, L) K //Method - 4 202s
/ {, [5 a: x* N; \4 R; z. D" S /*8 L9 }- b5 ]! ?' ]
for (int jj = 0; jj < N; jj++)
7 Z) I9 `4 h, I" z. i {, N* I1 @+ Q5 g$ B8 R
8 u6 H* b E( F0 ~% { }
9 h7 s! I" N4 v; u6 F' b */3 X" ]9 d' @- s+ c+ [
//comment out all methods, N=100000 202s 5 c( p q8 v: {$ H) [
}/ R# K) x1 m3 T
2 k$ V; o) U9 k2 E, a; H delete []b1;
$ m$ Z" s. q5 n/ v# r delete []b2; 3 w5 Y9 H2 f) @! }; H$ T
|
|