TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
+ Q$ V- A' `7 W' A- D. z Z; E& t& u6 K; W8 G6 l8 e
理了理思路,重新做了一个测试。- u- c9 L% G, f
做了两个 vector 和 两个 float *, 都长 1000003 O3 ~$ _1 \9 {! L8 H# a
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
9 R! a: w! a) C( |1 a! A }5 A. }' o
内循环试了4种方法,
8 o* ]2 `0 _' i* z$ \7 ?4 O1. 直接调用 vector inner_product 247s
( N8 M' P! P9 P0 [! V2. vector 循环点乘累加 237s. [* B! q* b$ b- W+ T- [
3. float * 循环点乘累加 204s2 {) v2 {* s$ N3 e' n' ]% Q
4. 空循环 100000 次 202s
' k9 ?" ~; D2 X1 Y" b
2 @ T/ i% ?3 F/ d不做内循环 200s
2 l. G0 z! }: s2 C- Q6 U6 D# S g% J `. E4 ?
你昨天说的对,内循环本身占比是很小的,大头在其他处理。! i/ }0 @; c& _4 g/ a/ F" c
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
& p6 M# u: ]! a& h: P7 i: ^5 l# i. U% r7 p; [9 e- A
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) s2 G% K3 r; {( w
) Y0 S* W# P. t" i/ s8 w! F
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)' N! W& p6 h+ K" s' `
7 N( G6 ?8 w7 K7 | _! X" {
std::vector < float > vec1(N);
, A2 a' _; U+ B K3 n3 ^ std::vector < float > vec2(N);5 d% {; S& {, O
float* b1 = new float[N];
7 ^1 P% M# w( T8 h/ G float* b2 = new float[N];
) Q h4 x" ^ W6 W" {4 p. J; P2 G3 y7 ~) U" @/ g$ w
for (int j = 0; j < 6000; j++)
+ w$ [8 A7 T, k$ E" h2 i7 v8 _ {
6 Z& o d7 n7 t9 ~; B, Q g% o std::generate(vec1.begin(), vec1.end(), []() {
' m& v3 t& ]( x/ z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
! k. @& J! p2 z+ h });4 f' T4 U7 F+ |9 e
4 G4 a- j. N' y1 n p( _) ?9 R std::generate(vec2.begin(), vec2.end(), []() {
2 I/ q% ^6 h( w0 p return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
( c6 }) ?8 m& z# S3 z });
8 D4 M$ r: L) p: r; x: y5 H. u$ E1 F$ y; [2 Q- h7 e! l
for (size_t jj = 0; jj < vec1.size(); jj++)
" r3 U% E. e8 Z" e1 J0 J {
9 u& S% L& k6 W$ l# I7 q1 { b1[jj] = vec1[jj];$ J! ?9 ^0 D1 W; v" h1 L
}2 o) k! b& w9 p1 |- R) u
5 Y, z/ M7 ^9 k for (size_t jj = 0; jj < vec2.size(); jj++)$ l9 y, {" ]5 n# W
{
$ Y( T. b. y; k- r6 I" L7 u b2[jj] = vec2[jj];
5 I% N* K3 K2 Q8 _' z }
% a- C5 t" L! u% |8 K" \$ U& W, D m$ W2 A9 A% |; ?
//Method - 1 N=100000 247s / i( u( |4 A9 r6 J# G
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);6 N- D6 o' s9 J$ V6 R5 ]6 w# `
; |9 k6 r8 C5 w( ?5 y8 v //Method - 2 N=100000 237s
( G5 d4 n2 Y% C) A) l( v/ V /*
% D0 Z! W* n$ T& c2 p for (int jj = 0; jj < N ; jj++)
Y& G0 O" z) p- N* p; V+ ` M" n {7 d0 l' N+ }7 C' i" s
fresult += vec1[jj] * vec2[jj];
6 d) b; p! w% ^ a. B }
( c Y. H z) X9 P1 M b */+ p* `5 d8 |; @* j, ^
. z9 {) I( z, h' W //Method - 3 N=100000 204s
+ W( ~* p* N( J0 n /*, ^% ?# X! _0 g6 n0 x
for (int jj = 0; jj < N; jj++)
! U8 r* |; V+ d# o/ x2 m {% w9 \# G: b7 ]: K
fresult += b1[jj] * b2[jj];; Q" a5 n' E8 g& b
}7 W# C2 G) d, Z/ _0 h
*/7 _3 f9 k+ i% g$ E( I& g0 C
7 @3 s! D* `% @7 `* j //Method - 4 202s
+ c( v6 G' w; [6 v% Q /*
- `1 A5 H* o" b+ m7 `7 S$ x% V for (int jj = 0; jj < N; jj++)4 @+ x, S" ] T8 }% T L; w( [
{6 i" [& s9 C3 K% D5 }7 _# E
# I& }2 |3 I/ L4 `% K
}: p* F A6 B9 U9 O" V% V
*/
) E: t5 i0 L* q1 \( [ //comment out all methods, N=100000 202s
# A: ]) i# P: N L. ^! v1 `) Q% _ }6 l7 d/ w0 M# s$ e* B# ]5 B. R
# ~: W6 g/ ~( Y! g/ J
delete []b1;3 Z* d3 O- }$ e' r. O; R) `* y& p
delete []b2; & g; f+ {* w8 I Y/ ?9 v
|
|