TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
9 {1 U0 d/ v" Y8 ]0 J
9 p5 w! U8 [! B3 l5 W0 r- @+ \- D理了理思路,重新做了一个测试。
; D# j1 v; K( J" z8 b }做了两个 vector 和 两个 float *, 都长 1000009 V1 Y# N1 s0 Y4 N' g
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.4 f7 k% {4 X1 j
+ d5 l1 J. e5 W7 J% ^% ~* P
内循环试了4种方法,7 ?. S2 W3 j8 q
1. 直接调用 vector inner_product 247s
% g/ i5 ]4 D8 R4 Z4 l! K2. vector 循环点乘累加 237s0 u$ Y) g; o. j: q: `, b
3. float * 循环点乘累加 204s, e* D! {' N" K+ p
4. 空循环 100000 次 202s, t) R/ c5 p6 ^/ y! ]* j7 J- D A
* e. r3 J. I5 l6 z6 P$ _1 \8 i
不做内循环 200s
) k8 Q" V' Q/ n- n/ F
, ]4 K% h! s; B: y& G% P你昨天说的对,内循环本身占比是很小的,大头在其他处理。
+ V5 h8 ^0 P Q! x( T另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# F4 g4 N8 _( W7 a7 e$ J
0 Z+ M3 f* [9 r3 S' ?2 {! j至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试): [; H# T' f9 C5 \0 }# m9 b
5 C* |# o2 ^( G
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
. C) p& Z X: P: y" @" ^& E$ c8 a/ c1 ?
std::vector < float > vec1(N);. \" m+ Z2 v" ]( F
std::vector < float > vec2(N);
3 T- F% Z& p- j# _* r6 ` float* b1 = new float[N];# r; j3 [, n" h
float* b2 = new float[N];
* z2 F4 y8 k- x, f! ]
- ]0 Z% `1 }6 j' q for (int j = 0; j < 6000; j++)
4 M: L2 ^: f$ d2 i6 M {% f5 E+ A3 V& B" C5 J
std::generate(vec1.begin(), vec1.end(), []() {: z6 t' [) i( ?9 f6 M
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, P0 r9 z' a w9 Q& p& t ~5 }- ^
});
7 @" Y6 ^* {( L4 ^8 T5 U! l6 e
* x t# p& i: c8 h, \ std::generate(vec2.begin(), vec2.end(), []() {
9 o; V1 R5 U6 Z( | return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
- }1 r* P- y1 G! A s- p });
9 k K+ M1 O$ y; a/ O0 {4 |
& e j, [( U" Z! c for (size_t jj = 0; jj < vec1.size(); jj++); h1 W. a6 Y8 q I* w6 y
{
! @- n1 ]9 M( ?8 P b1[jj] = vec1[jj];$ t5 ?& _$ _: b
}0 f- Q% l4 h0 q4 m
5 F7 u2 Q& ~4 z! I
for (size_t jj = 0; jj < vec2.size(); jj++)
" {! B g/ l! d0 H- n {
L" H# Q* R3 {4 z b2[jj] = vec2[jj];
1 C5 ` j) Q, J }
* D2 `6 E( J: c) s$ O, c% z3 C9 R- g: y
/ B' I4 F' ^5 D" k# d3 H //Method - 1 N=100000 247s % m7 w& C6 a; ]$ S0 o
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
( B# K7 A5 a0 | _' E n+ s& t% E
. E5 @- }1 i6 ]) L3 t //Method - 2 N=100000 237s
; O, a5 j9 r' J /* t8 z' r. N3 i# L
for (int jj = 0; jj < N ; jj++) n b0 b$ }; ?2 X
{5 f6 _ s- k u6 i9 ^1 y
fresult += vec1[jj] * vec2[jj];
. i1 H8 D, `0 r6 l }. r# _' J0 Z5 s8 l. v
*/
; K w X' a, e% ^" r3 A! @- Z
3 M# j. C) Q" F( |" H; w //Method - 3 N=100000 204s
H) Z0 H! t7 i7 K& g% j' N# Q /*
6 Y' g; K# S" f8 t for (int jj = 0; jj < N; jj++)
$ ?9 d7 C: k3 k F- L4 O {3 v0 \0 a+ a4 R- m. T1 P2 v
fresult += b1[jj] * b2[jj];
9 q# w, V$ f/ u# m! e5 P& p }6 n- C5 w0 `% r' n9 i
*/5 _: ]. V& t7 V! c
0 m6 Q& S5 O8 o. u- ?5 t) h
//Method - 4 202s2 D' {1 b: p& g% n7 d1 x
/*
; P2 X. Y+ D" j2 ]& F! H for (int jj = 0; jj < N; jj++): ^! E4 g. x1 W. J1 E
{+ f! b1 V) G; t9 k6 `- I
7 S$ r) X0 p4 z# Q% Z' W0 u8 l. u8 ~ }
! T& T p/ ]2 X, v' q5 s; V$ v& v */$ ?+ ]7 N0 X: g7 D3 r
//comment out all methods, N=100000 202s 5 L/ A; C/ z* Y. \4 D3 G
}4 G, ~! q9 y5 ]8 c
1 K0 a' z& Z2 Q3 G# F delete []b1;
6 a& a9 f v% U delete []b2;
* P% S. s+ ~& |0 F3 l |
|