TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
0 b# |5 o9 n) e9 P: V5 m0 d4 Y( E+ D) @$ T' n' g3 s
理了理思路,重新做了一个测试。
9 g# V9 T7 K4 g做了两个 vector 和 两个 float *, 都长 100000
% t- i- j: T N' X外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
% Y% T) V* e+ u% j
9 T; c7 b" d% V3 @7 `内循环试了4种方法,; ?$ C, }3 j' J" @; s$ p# O
1. 直接调用 vector inner_product 247s 7 U6 [ K, l7 E/ p% ]6 U1 n& _
2. vector 循环点乘累加 237s
# i t3 ?" c6 s9 a- E$ ]8 @* T+ e3. float * 循环点乘累加 204s
' G0 k6 q4 x! o, ~; @4. 空循环 100000 次 202s
, k I* Q, w" D! p8 G% t2 g9 P7 B9 [5 H9 h$ h$ W5 Z
不做内循环 200s- \% }9 b' H z
' C* L8 I$ {- K) y! I你昨天说的对,内循环本身占比是很小的,大头在其他处理。5 K- e2 x/ T) x! O5 [
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
+ ^" T0 h% d8 V- U. I( w* S/ q' U: C; x8 [" ]9 Q% U
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试): Q- w ~- m1 H
) q) C7 L. O b! L8 u. i(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)6 Z# b; p1 X6 u; \
, Q( `% N, c* r9 h* L std::vector < float > vec1(N);
+ d$ D9 C" }0 m0 F( @0 `8 `9 _ std::vector < float > vec2(N);
0 ]6 n" w8 Z& [. ]" J float* b1 = new float[N];
' m% @. S4 m7 N# E" o8 K! w float* b2 = new float[N];
/ S. l L8 z0 x
A/ L, w" K- g! l9 I3 a6 } for (int j = 0; j < 6000; j++)5 J2 t4 L+ C) O5 H" }: I. B
{& Y7 z4 u; b' p) _/ |- ]: V6 }
std::generate(vec1.begin(), vec1.end(), []() {
+ S8 e. R, D, P/ k/ \0 _ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 S; r' B# w5 B) u
});7 k3 i0 ^7 Y C' X% Z' Y/ {
: _; `/ A# R9 E
std::generate(vec2.begin(), vec2.end(), []() {# K& _/ A: M2 ^9 |- j
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;: g, o6 R; r) U2 i; Q# {3 Q2 O
});4 E/ I" d( B7 a2 F8 \
0 Z- C: p6 m$ y9 I7 B3 \% |3 Y$ R
for (size_t jj = 0; jj < vec1.size(); jj++)
' I6 p: E2 q3 X8 s {" F* O7 ~; K4 F+ @! k# O9 O
b1[jj] = vec1[jj];
# R% @6 Q9 k$ @' L- B8 q% f& h }2 B p0 a! m1 r d! v1 [/ e
( V* K5 ^: X9 \0 b0 j/ t for (size_t jj = 0; jj < vec2.size(); jj++)
( |$ Y b( Q- k* v {! h& @- A2 K2 Y4 n e, _
b2[jj] = vec2[jj]; E o" [& J7 A6 i8 V2 S' f
}
9 z) K6 m- F9 v T
, U3 z4 @5 s: \4 X8 p //Method - 1 N=100000 247s
( W" g0 v5 X5 U, @) c //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ j7 n; @/ A/ @. l( U& ]
; a1 m' q2 j% B, k$ w h //Method - 2 N=100000 237s
3 ~$ a2 g3 a! N* M$ a2 z /*4 g* g# f) e+ m6 W1 o6 _
for (int jj = 0; jj < N ; jj++). p4 Y! X9 @. J s
{
- _( v; J" b$ ^4 u% p fresult += vec1[jj] * vec2[jj];8 w3 u$ n2 R* A! H- @* s
}* z+ U7 \, p% `, D: i
*/( S% Z, ?: K$ Z
0 ^. p0 Y: Z# r( s
//Method - 3 N=100000 204s
. d$ d4 V5 d' T/ p4 R) q0 m /** H3 B7 s, m, h$ W) R9 u: g: k
for (int jj = 0; jj < N; jj++)
- q; T3 M4 ]9 \* b {! s7 N% i, _( C& O# }" i
fresult += b1[jj] * b2[jj];2 |; d$ O, L& s' O5 }: X3 c1 R z
}/ L" q* B- w, r; ]) q( O
*/
7 D4 a: Q: D- z* T& y4 r# [0 Q3 _# v7 F& M
//Method - 4 202s$ s5 |: ]7 F; I* L1 Z& z
/*
( D1 U. N0 S% e* f% g& S+ X for (int jj = 0; jj < N; jj++)
( T' Y0 J; z5 h# }" f1 V {
5 j! {# `" ~0 Y
0 U5 Q6 m A6 h/ W# Y4 j: k }7 y% r D, _1 M' V& p5 x5 B
*/: v* u- W* O$ ?5 n% @1 k) \2 M
//comment out all methods, N=100000 202s * J% F# X8 Q) ]/ Y/ y2 h5 G4 N
}* y+ P4 h6 j6 F$ D1 H Y/ H% S
! S8 q2 c4 c! y: v% v& e delete []b1;
1 L% t+ I8 r, r, D; _ delete []b2; x1 h9 _3 y( s* b( }1 d
|
|