TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
8 |: B) p" X; g5 S, z7 O# a- c; b* O5 J, ] I& b1 P4 K
理了理思路,重新做了一个测试。 y# @9 M: A# ?' F* b
做了两个 vector 和 两个 float *, 都长 100000( l: a3 J/ v! [) l' O) R; q
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
* e4 ]- L9 U; s- g [
3 V: C' g( j. ^2 N; ]7 o' {内循环试了4种方法,
, a0 g( F6 Q0 Z, ~1. 直接调用 vector inner_product 247s
7 C {1 B' w, D& k2. vector 循环点乘累加 237s/ t4 B8 G- @) v
3. float * 循环点乘累加 204s
7 V j- t1 q9 x5 d3 C4 V6 L4. 空循环 100000 次 202s
% x+ o4 l. \! B* |! x J
; l: a) U0 f. x7 z; E; Z不做内循环 200s( Z+ S s' w& w6 o
8 f4 O" d( S9 a" x1 l7 v% d/ A" [" {
你昨天说的对,内循环本身占比是很小的,大头在其他处理。) w" {, _* [+ q- ]7 d0 h
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
0 f9 Z% u- J& Q+ N" Y$ p
& n2 E3 W4 c( h% {9 v+ p至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
: i q2 f' k5 X+ n1 ]8 ^
: m2 i0 T* q' b! q( {' T+ M(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
4 A& e6 V6 J6 V! {1 F# A4 X. k( n% Z/ F# {: Y
std::vector < float > vec1(N);
- t# j, M7 }5 Y7 F std::vector < float > vec2(N);# Q; o- w& |/ @) f9 @7 j% t8 f
float* b1 = new float[N];9 j7 w) X5 P4 o& v) I( ]
float* b2 = new float[N];# _" ~3 F2 g3 T$ P
; u4 k+ B3 ?6 t5 u5 o( x( ?+ z
for (int j = 0; j < 6000; j++)
2 [/ k( z6 p7 G" v {' f- C" R8 ^* X% S+ k5 n
std::generate(vec1.begin(), vec1.end(), []() {
7 Z& Y9 @ Y0 s! c- r& e, Y0 [ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" v$ A" x6 g5 S/ `2 }
});; r$ d3 U+ T# H3 O! W( r/ N
7 Y3 x5 k/ [' j ~" I
std::generate(vec2.begin(), vec2.end(), []() {
! d8 p0 e" a7 T( t return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
! f" u2 O! L8 G });
: N* {3 j1 b# q- s8 e4 l$ \* a# J" H) c! O# V: H
for (size_t jj = 0; jj < vec1.size(); jj++)" ^6 I; E# W: W" @. L
{
0 o3 K N: k6 H2 I' M% ?. D" b% J+ a b1[jj] = vec1[jj];
+ R$ ?6 s; \) C/ ^- ?, l) e }4 A7 p; F9 z3 q( F5 V7 M
6 L, }( J2 M& R7 G- P for (size_t jj = 0; jj < vec2.size(); jj++)! N3 H) C! u; U1 e* L! R x$ T: h
{
0 ]& b. F$ \$ m b2[jj] = vec2[jj];
" l! ~# X' R8 l8 N( L$ b5 e1 H0 r+ o }
% Y( l# c/ i% _: Z! J' E$ n
$ X7 h; y4 g" w1 j9 ?6 d //Method - 1 N=100000 247s
# n e' g9 B% g //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ n( ~' J1 D' Q; g/ q # L& {* f" i: L9 Z: X
//Method - 2 N=100000 237s
- i& v) x( C' y" S1 L' T& M0 H8 F /*! T% U& n, I; x6 M- v+ s2 b$ w% r' z
for (int jj = 0; jj < N ; jj++)% c! a* u! n$ h
{
+ l4 O Y3 {$ D' s2 o0 i5 } fresult += vec1[jj] * vec2[jj];/ Y7 o$ ~1 O+ o, s1 A. @, V, q( S
}% \, e. c5 g; {, y( X( v
*/6 j1 }& c/ Z/ E
; s7 b3 E* l* B0 q! F, [" O& u
//Method - 3 N=100000 204s8 L& J U' ?/ J. a
/*% q! L6 m9 _$ A+ ^7 Y
for (int jj = 0; jj < N; jj++)
1 t: ]! B8 e4 j. L% O, E {% o4 c1 s+ k4 g
fresult += b1[jj] * b2[jj];
+ d* Y9 E1 N0 _3 B }" A' Q) ~4 b0 B) j- Y
*/3 S! G2 B2 G4 M' y9 i! S" L
2 ^2 b" p: R- ?2 D //Method - 4 202s" ^1 U3 h3 L! u0 Q
/*
7 ^( j: _# l& l- P) D+ r7 s for (int jj = 0; jj < N; jj++)
# \* i2 h# a' I7 y5 B {
8 D8 {$ q* W2 L E
# j) X. K* g/ E$ Z8 p }+ m8 ^9 X: O. B3 n4 ~$ ?
*/
7 d) ~: v: B% N$ U //comment out all methods, N=100000 202s
$ h3 Y- q/ l T* U }7 o1 c; ]( S, w) S% s7 X
: i `1 X( O" _" n/ B
delete []b1;
! ?' L. T D- Z- X7 W delete []b2;
4 R' z! G# J4 v8 L, w* D6 S |
|