TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 9 E, W0 @* l. n1 f- |0 I
7 I( f0 e1 J. [) W5 h p( M理了理思路,重新做了一个测试。& Z$ _ v% @' ~" @; a
做了两个 vector 和 两个 float *, 都长 1000000 R9 X$ E( f& C, z
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.4 w3 H. \. e& S( S: D& u1 q- w
5 z5 [% G" l9 S# v Q; q- E. o内循环试了4种方法,
R4 N" c/ N! p1. 直接调用 vector inner_product 247s
2 V) D6 g; p$ K: j L) E- [1 H4 H- X2. vector 循环点乘累加 237s$ B% h8 ]% R3 U, R7 K) G7 @
3. float * 循环点乘累加 204s/ b9 z1 y0 F1 m; i$ U6 X' D
4. 空循环 100000 次 202s$ ]" A/ ]% S- s) }: u# y
; S& L: _8 L2 q8 c6 W# `7 ]
不做内循环 200s
! [( r5 y K, }# {$ `$ ?8 I* c" s1 p: ]
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
( e( j' J: Y- U* [) b: m4 j# ]/ |另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 h4 L3 ], O t& l: a0 e, c% W! P
( h6 W' C8 Y' M$ I* W" s* c
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
% |/ G! b' G- H8 M' L% k* h$ i, g! d$ @) A9 p" T# y. k
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
) A. w- L/ |/ z% X
: g( B3 K# u/ A: o5 F R; c9 I std::vector < float > vec1(N);
6 V, O, {+ F) Z2 a+ q! u; @0 u std::vector < float > vec2(N);
2 K. K, _5 y- A( E1 D+ Z float* b1 = new float[N];
( }& Q3 @% i9 l float* b2 = new float[N];* Q( s+ f# h/ ]0 ?; D2 H3 b: t
/ B# R" K& L; ~, A* X" u for (int j = 0; j < 6000; j++)$ Y& H) `: H" F# A
{* v: x L: B/ B2 @2 p0 W) [; Q8 {
std::generate(vec1.begin(), vec1.end(), []() {0 q3 C0 p; C6 h* L/ j; l
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 e$ k2 t o" T4 @$ ~
});
4 V& O; s$ X- k* z) @+ X( D0 d E- [, G0 p4 r* G$ @* i- t
std::generate(vec2.begin(), vec2.end(), []() {0 G% f- a+ W" v: X; h" y% N
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;% B, {# u+ ?( G& c8 k
});; U2 L* D& T1 |( ~, t/ R* K/ }3 T) n
' `- _; l7 p! f% H' B0 R1 a
for (size_t jj = 0; jj < vec1.size(); jj++)9 [: J" h4 N5 D& [$ @
{& u4 ^; X6 K/ T" e( J$ h
b1[jj] = vec1[jj];
6 h0 ^& K* L2 f0 a5 L }, B# d# q4 r! D' f+ r+ P+ ^8 V
% b) N& o! P9 ~# {1 E R
for (size_t jj = 0; jj < vec2.size(); jj++)" S' X5 c' w, r, I4 J
{
9 K% ~' i: b1 v% b5 Q8 J* ^: R b2[jj] = vec2[jj];
5 e5 D8 ?$ N9 I X5 s0 d3 U3 B& \ }& S. p3 h# L# Q
' q( G* j" J$ X6 w //Method - 1 N=100000 247s " h: p% E# H% }9 y1 F! N% W8 @
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
* H3 b; d) R3 o! F / d; N* x2 K3 J; s: h4 h
//Method - 2 N=100000 237s1 l; y3 F' S5 B! ~# t! h" [; u# ^5 E
/*( S: b+ @" E+ a' |0 j
for (int jj = 0; jj < N ; jj++)
2 A8 Y2 P6 U) Z4 R- w. Y! m {4 Q9 `/ K$ W# K/ J& h
fresult += vec1[jj] * vec2[jj];
' ~; l0 u. a" U/ M% }1 X% V }) x* |7 B* r3 l4 i% @9 f
*/9 m2 P. ~- Z. i7 }( c+ V2 n& |6 n a7 I
. x- o8 Q+ n7 T. d. E& \ //Method - 3 N=100000 204s( [) e [( g$ Q, ~: t- q
/*
/ q1 h. u5 c% n/ L1 W l. M w6 r for (int jj = 0; jj < N; jj++)
" J$ |9 [8 E2 m8 g o {
3 T1 R7 r. }; R fresult += b1[jj] * b2[jj];
. Y/ x% W" g' _% ?; g/ i3 l }
& {! H* {: L% z, C* ^, c1 m */
2 G5 ?# s. o6 U' K* C! {5 p8 X% m+ a0 x- h7 M
//Method - 4 202s
; @% ]! |( |, }: |7 v! \& b. e /*. G" v/ t+ e% B4 p0 {4 t
for (int jj = 0; jj < N; jj++)
' a$ }* W- V, M0 S. } {* o+ c3 } f0 I0 n2 w6 U3 j' a7 ^
2 M+ g4 u( S& y" L& a }8 h" j) |: c% H) M( H+ v5 d
*/
/ u- L( a6 h# c4 H3 W1 Q //comment out all methods, N=100000 202s & p& ~5 @! S- ]! b# z3 G1 t' e
}# P$ }3 M+ { l* N+ l K F
! p7 T6 z- Z; Y, Q* V, c- ?: v
delete []b1;! B5 ^2 @' Z6 p" Z
delete []b2;
/ C, T, O( X: t9 U: l |
|