TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 2 ~' t' @, I, s5 e! n
# Z$ ?, F& m+ y% M+ C理了理思路,重新做了一个测试。8 u; a/ t0 c/ |7 e
做了两个 vector 和 两个 float *, 都长 100000
y& ~+ J/ _+ R: N7 S5 g外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
% P/ a5 |- w: C: p* g+ D5 _( i: _/ ~! V9 i2 k
内循环试了4种方法,2 q. @; e( n' M( Q9 U" ?, D
1. 直接调用 vector inner_product 247s $ n6 z2 S! g$ z6 {9 i! u
2. vector 循环点乘累加 237s; ]. q+ H, D# D
3. float * 循环点乘累加 204s
* ^* r, C( J& g v! f4. 空循环 100000 次 202s
' }, G+ c5 Y4 a
% h6 Y2 N# ~) [ b( |* E* `不做内循环 200s6 f5 Y$ y; Z& y( G& k
* S; T4 w- [9 A( K1 L, W你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 i! v4 ]; L" M6 i! Y( g- H
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 m% e4 V4 h! M$ F
1 v0 X7 M* n2 f8 G0 k1 m至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试) F# d, H$ b# u9 Y
* h5 A: Q' B2 R' t) g
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 d5 \1 `1 l; ~
. q! u* U5 s4 I! C, x' J6 X! v! A std::vector < float > vec1(N);
, j( B, t# f& h& @. z$ o3 i std::vector < float > vec2(N);5 s" N' L: \' @
float* b1 = new float[N];
/ p, p; B$ P3 ? float* b2 = new float[N];8 U+ P+ o7 u- j* ` ~; Y) J# H
8 e/ _$ W, n4 L; \4 c7 F! k
for (int j = 0; j < 6000; j++)) g- {2 H, M/ P- Z: ?9 ?. P1 b* o
{
2 d% F* l" @ e" V std::generate(vec1.begin(), vec1.end(), []() {
2 C* c0 O C" r2 p0 { return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;6 q1 _ B( V- o: J" e/ ]4 [7 ^
});
, _+ g3 J+ y, m* M* \4 K9 z$ y9 {7 ]0 c( H: h" n- A
std::generate(vec2.begin(), vec2.end(), []() {
2 Y X* G5 k( F return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
; P* n9 z( J6 h9 ` u/ T3 U });7 p* C/ A2 L5 Q1 `1 b; v2 m) S, p* @
* H3 }, `4 y( z) W G7 K M0 s5 } for (size_t jj = 0; jj < vec1.size(); jj++)# x, k5 n) e! H
{
4 g9 B5 |3 D$ a8 M, _' G4 Z5 _ b1[jj] = vec1[jj]; q2 e& {: I- h. m& z& G3 E6 D
}9 t6 `" T) r8 U9 ]" n$ G% D, D
# j3 V. i# e# I for (size_t jj = 0; jj < vec2.size(); jj++)* S% Q. e$ j% V# Z9 F8 i& [
{
! g/ L: Y! s. Y2 o; Z1 O2 ~ b2[jj] = vec2[jj];8 J3 B$ `+ |% `: I
}; h) a: P, k1 H1 _- b
/ S2 J* ^% G/ ]2 q; v2 F& j //Method - 1 N=100000 247s
/ j8 K2 k- s: c% c2 {- N //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 t& ?+ ?1 v. l9 h! l' {: k5 B1 Q
; g. Q, p) r% L
//Method - 2 N=100000 237s
4 P* W" Z4 L: R! L9 ]+ x0 c2 s4 B+ t /*
0 _ s1 r7 a8 {+ k for (int jj = 0; jj < N ; jj++)' }/ S$ P" G# `3 X" ]6 D
{( T9 P( @0 h O* A' S
fresult += vec1[jj] * vec2[jj];
! T# H( [8 G ^ }
; h/ b( ~* |, _+ l */
5 x; N+ C" g' L1 m- t ( c! ~ f9 j9 `+ c) g% @
//Method - 3 N=100000 204s/ e& A6 I; {. R% M3 ^; D5 O" L
/*
: p4 k& a) S6 `) `( i# h for (int jj = 0; jj < N; jj++)
4 V" S+ G7 i' } {
" `( x7 n7 X3 ~! l% k0 r. [$ s fresult += b1[jj] * b2[jj];
; M% ~3 ~8 A; Z1 S: o! _ }/ c/ P" l8 M1 t! I d
*/
0 g4 j f2 m$ f) w' k+ x5 ~8 G% \- D( m+ O4 |) [
//Method - 4 202s
& k7 @, o) Y- ?/ m; [2 o /*
/ E9 f1 h" c# W! { for (int jj = 0; jj < N; jj++)
4 V; {8 p1 F0 s1 }# P' G% | {1 q- \5 t, j0 y6 |
# e; ~3 M; m- w+ v" u+ V }
9 F1 a3 p d7 L; O* s */" @/ k+ {6 C# |( ?1 x" }* r G4 \
//comment out all methods, N=100000 202s ( ?: w- [# D: A" P! \% F9 a' M0 [4 I
}
2 i0 y* G- C& g
# W+ a* ]# z' Q2 Q+ z( r, k# ` delete []b1;
j9 q0 f I. `% V7 \5 B4 p delete []b2; 4 T+ J* V1 {$ k% ~3 `
|
|