TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
1 t0 @6 m B& x9 f
* l- Y& b% ~* V# w J理了理思路,重新做了一个测试。
, ` R* m9 j$ D" v做了两个 vector 和 两个 float *, 都长 100000" I6 o5 R/ _' s
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.4 ]& O& ~9 ?8 m0 w' C# n
% n4 D8 n1 d; |' h f+ _内循环试了4种方法,
. [' |# ^6 G% S9 Z6 `1. 直接调用 vector inner_product 247s
5 Z2 n4 G: b; f, T& I3 z' r1 E1 G2. vector 循环点乘累加 237s
' z4 k# B6 V$ F5 u7 H3. float * 循环点乘累加 204s" t+ e% M0 V# [4 |8 r
4. 空循环 100000 次 202s. D& E1 i7 w8 y8 {# z
" }0 @: Q9 s7 }4 M9 m7 s不做内循环 200s
6 K. Q& D; N6 t+ s, i" V" m7 g9 O9 o0 l) e! Z0 a$ K/ J! U; p
你昨天说的对,内循环本身占比是很小的,大头在其他处理。$ ]+ s3 `1 y5 s9 n4 n# G4 {4 B
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
o& t r/ W" t) ~
& b6 d9 l! ^ v9 ~至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
# M- }4 Y7 s7 [9 y: I0 B& n; h$ L: i* v$ b9 K; {
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
! C7 O# v: o0 o! k; p1 u0 I/ e x- t
std::vector < float > vec1(N);1 v8 M. @. w4 K( f) L2 U5 P8 y1 j
std::vector < float > vec2(N);
/ H, k, c C* h6 K4 n; y) A float* b1 = new float[N];# H6 | @9 ^. K* B" d0 g" V6 {' `
float* b2 = new float[N];
8 x6 {0 B( n4 X) p3 W) Z. a+ \6 ?; A w' c6 M
for (int j = 0; j < 6000; j++), t# H9 F! Z& ^' k! X* Q3 N0 v
{& A, N" m" G) Q) ~# t& p
std::generate(vec1.begin(), vec1.end(), []() {
6 C; H, f1 k; x' z7 J2 X8 v return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, S4 P. Y4 @3 }+ i% T, t" j
});0 Z; N5 z4 Y, l9 u0 n7 _0 _% ^# n
1 u4 C- H' D- | B; z0 g$ y std::generate(vec2.begin(), vec2.end(), []() {$ V8 D8 U. b9 r, L
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
; T8 m& h1 f6 c, `* j8 B });
" K$ t. q, K* M6 ~; c6 ?: \1 N$ F: A2 B, C, s+ [2 v4 R* R
for (size_t jj = 0; jj < vec1.size(); jj++)
3 z8 `* I! b& b1 ] {
. T4 ?6 x* ?, k b1[jj] = vec1[jj];
3 z: j }' ?. T1 P; A }
: ?* A! e1 g' q( v" n' t% C8 Q* Q* P) Y0 K& y
for (size_t jj = 0; jj < vec2.size(); jj++)
* `+ w" m1 `* g6 s/ c {! w7 Q. q& Y, A5 q3 P- @" ?- O
b2[jj] = vec2[jj];; e4 P, L0 F2 ^( _3 \
}
% J3 g0 o0 H/ i2 ]; ]& d) n A9 Z z6 \! R
//Method - 1 N=100000 247s 1 }5 x0 f& D* g/ M$ j
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ j+ p1 S1 S) I 1 X( D8 S8 m& c3 o7 }- m1 p4 ~9 K7 k: m
//Method - 2 N=100000 237s" Z& `3 ~2 @1 P1 F/ B$ Q2 V
/*
+ p% { [1 U% g for (int jj = 0; jj < N ; jj++)* K/ j& m8 g! @2 `7 g1 h' f1 U
{ w. b9 I7 {+ F* M# S
fresult += vec1[jj] * vec2[jj];
# p: w/ K! _$ |) V- S' c }* A0 m3 \: J2 F( W+ `
*/" d1 h- f) t# M1 q- x
7 Q' J$ G, e% E; P! p/ v //Method - 3 N=100000 204s: _. W1 B1 S/ Z! d
/*8 w1 H# s5 G( B2 u# Z" h* K
for (int jj = 0; jj < N; jj++)
1 B: [+ \8 @4 D1 \0 s! t {
) o/ g/ Y8 m8 ^, m: d fresult += b1[jj] * b2[jj];
+ D/ `% W5 _9 c' c D) r }- s/ s1 F* X E# J! o
*/# @! G Y6 e0 B; @1 H6 p
& c( [" v6 }; F //Method - 4 202s
. O2 H, F( v J) G! Y3 X /*1 u2 C' }* l( i# X
for (int jj = 0; jj < N; jj++)
# C1 m2 O! g8 x0 v& d) N0 v$ h; ? {
$ c3 S) y$ R+ a2 Z( N
; U7 J5 A! U! N" k! y/ m, Q }
& P, g5 G9 F+ \# E; i */: _3 E% R$ ]; ]% U i4 u7 {' q
//comment out all methods, N=100000 202s 0 D/ }/ _8 f3 [- z+ U' U4 G, Q1 S
}: J# o0 {. ^2 x( h/ t/ c
3 O, \4 t" m& t
delete []b1;
& O0 E/ x3 }! e; A( F8 y delete []b2; ; t; A+ E! F" n6 s9 ?
|
|