TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 " Y0 @3 `# M$ _+ P" ]. \3 B. f
( O, e i; q) c: r# D. Z7 P理了理思路,重新做了一个测试。# Z0 m$ a# W1 \. q0 z# B) E
做了两个 vector 和 两个 float *, 都长 100000/ Q) R, J' \, R
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
+ G" i( O* w7 Q# M* |( `- h4 U) N7 |' q9 Y
内循环试了4种方法,+ w& u* s$ L5 ?6 n8 m: T( [
1. 直接调用 vector inner_product 247s
. l# Q& A" P k& q, ^0 x2. vector 循环点乘累加 237s
O% r2 S4 a! B7 b0 K, g3. float * 循环点乘累加 204s
/ d4 E5 z6 X) Q1 B, b5 ^7 ]4 B4. 空循环 100000 次 202s4 G) N; {9 R0 e7 B; a6 W" f
) R8 m S9 E- @- C" G0 u不做内循环 200s
2 l! G7 Q7 L4 X' h1 B6 A1 D$ ]. l$ K( u
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 `' a9 G0 ]- a% f7 H% @另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# `4 X! M7 h: l5 M1 P7 d2 G6 k
3 k) N u L# @) R4 S
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ {& r: ?1 l3 ]4 q
- b/ I" |6 x% s+ o6 R, Q g& U
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
7 W7 @* R4 ^, `* v# A! |( H: V" J) b
std::vector < float > vec1(N);
8 U" W4 `5 _3 F U# \6 N std::vector < float > vec2(N);
1 H" N/ k( K6 j$ A4 Z) D float* b1 = new float[N];9 S1 H/ ?# B% A( {
float* b2 = new float[N];) F- l6 A# j2 |! e% v
0 \7 \/ V5 f; s2 b- [( U
for (int j = 0; j < 6000; j++)
& a# `4 S$ K( B/ K% D4 c. ~8 R$ { {
) c6 N7 _1 Q$ r" n std::generate(vec1.begin(), vec1.end(), []() {2 ] d* M$ o4 K( A! D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
' _: L! K& F1 V" v$ G9 l; c7 \ b' y });* J% J) ~9 H: Y8 z6 l- x4 s
3 ~- ?/ `" \% C
std::generate(vec2.begin(), vec2.end(), []() {2 P% v' ? B* f2 g# P# R% H
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
! K, K: b7 m7 z9 b! P* ~. X });; E$ Z+ V0 \. i( g% P* @; O5 D
u0 e8 a' b7 N& v$ R
for (size_t jj = 0; jj < vec1.size(); jj++), s9 \7 P6 L* M, U2 a- C
{0 X8 |5 E ~; F/ {# j, {( K
b1[jj] = vec1[jj];
# a% E1 M& |+ ]( {0 M+ {- D }
7 m( ~7 S7 N' }9 ]- T: U; w. Q% s! V0 E
for (size_t jj = 0; jj < vec2.size(); jj++): \/ W, v& q- c2 l
{
; u# R4 H2 Z- i# e/ ]; o b2[jj] = vec2[jj];
0 Q3 q9 B0 k$ w Y6 B& l R! ] }( n; ~6 Q5 @. H V: s; w- G* q
: |- R: J& `, ?( c& C
//Method - 1 N=100000 247s
& I: |, V: N1 V; U3 I //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. I% N0 R% o& x
, ]8 o& ~& I4 x0 L, \6 V; S$ P
//Method - 2 N=100000 237s/ D) c; F* V: |
/*+ @+ D1 S; Z R% Y
for (int jj = 0; jj < N ; jj++)
! y \, ^$ d# w, p+ u$ @5 }3 _ {
5 g2 @4 u: L V7 ^1 O; i# _ fresult += vec1[jj] * vec2[jj];- S! @- N9 i7 L% h2 F, o
}) t K4 p/ n; m
*/
# c. t5 @- Y% h, |# o' D/ V
/ i! e5 S' I1 G9 X1 b //Method - 3 N=100000 204s7 k" \) n; H. [ `
/*2 v& ^/ ~: L) V. ?( d
for (int jj = 0; jj < N; jj++). e" ~0 Q' ], V- F8 ^' d
{& @( i! I3 p! I$ T: k* w
fresult += b1[jj] * b2[jj];
, s) _, k* F9 j( J! V4 D }
' I! M) G7 Y* A5 `/ @: l L! G! Z */; i3 E! B/ y, Q* @+ a: D4 ?
$ H( s) ^" y8 U //Method - 4 202s
s _6 S3 b- f" f /*; X9 j1 \0 T* U
for (int jj = 0; jj < N; jj++)1 G4 H) {& I$ h! Q
{
# H" [( d8 F, N' H" O0 \9 i# o 1 ^; f- ^) B+ q; s/ ~ @0 q
}1 @: h, k# A7 x3 v# U& y4 k% N
*/7 v0 h) P' `# i4 I5 `+ J: k
//comment out all methods, N=100000 202s
8 g/ J: k5 z/ y5 A }
! K( I2 S. `% T( l
0 S- v3 i$ g, ^ delete []b1;8 Z4 V) X( Z; M! F) `* L& K
delete []b2;
$ E' C: T* k6 K& F+ ^& R- K# H |
|