TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 : V! a7 r. F4 q% g: f
8 j- [& u. |+ q; G; @6 k
理了理思路,重新做了一个测试。: ^( c9 h0 u3 ~; g% q
做了两个 vector 和 两个 float *, 都长 1000001 U( ]2 f7 _# H7 m& f6 ~
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. p2 a' [$ K/ z( ~$ T, a' @" J
% A# Q' o! r8 _" x* d7 z+ Q
内循环试了4种方法,
6 p! A! B# D- ]1. 直接调用 vector inner_product 247s ^6 x! w0 u# H: |$ |/ ]5 Y" c z
2. vector 循环点乘累加 237s: }( F4 ]& E% E3 N
3. float * 循环点乘累加 204s
, {& ^5 A4 F$ |1 r4. 空循环 100000 次 202s
, C' e; X8 _! ]) \( Q# k. t5 G* D' R
不做内循环 200s
, [& l! h$ [( Z% Q6 _
, w3 g4 o2 j% j! T" ]& f6 j你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 n0 i/ Q. s! Q. c, A# J% \
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。4 p) f. G5 j8 F" G; m
( x. u/ T2 B# c* n' b3 m" N
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( V, e: J. H( p% H/ y
6 G9 \; d8 l6 N$ T' k4 d. g(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)* G% s, ^( u# W8 [. j1 s
+ C. b' V2 f2 o6 C, ~
std::vector < float > vec1(N);
( B& K, c/ N* Q+ x8 T; r5 k std::vector < float > vec2(N);
+ ~$ z9 H( J2 U' X) _ float* b1 = new float[N];
. M0 Z% y1 }8 D float* b2 = new float[N];% a( u |2 Z! T$ t
: ?8 r1 \- B# b2 V2 Q {6 u1 a/ [ for (int j = 0; j < 6000; j++)& }# p4 Z" }2 g3 l, Y& R
{4 L% w- m4 o& Q4 T( Z- F2 s; B
std::generate(vec1.begin(), vec1.end(), []() {
. D+ D1 n m* E$ ]; K$ p return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 W' ^5 s2 V8 Y( v' i z2 a });. x$ l" Y9 W+ P- ?3 U1 }' Q
: L U; Y0 `4 R2 f std::generate(vec2.begin(), vec2.end(), []() {
) y4 O* P9 E- v' J return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
8 W7 c1 T# `8 \* m });6 [" _/ {( S$ B0 M" P! |6 q- C
# o- \" u7 L' d3 z8 \
for (size_t jj = 0; jj < vec1.size(); jj++)
, }' D' d. C) L- ~- i" L; s {$ d Q( Y5 e8 K7 n Z5 T* X! N
b1[jj] = vec1[jj];, V+ p$ t6 S( B' V H7 ~
}
; {5 b r. o4 s0 X$ q* t9 t
3 {6 S$ j. B! r for (size_t jj = 0; jj < vec2.size(); jj++)
. Z/ ~; I* w% _7 Z d {* W6 V; m2 K8 J7 A2 {/ _$ H
b2[jj] = vec2[jj];
3 h; O" p2 U; z$ F0 p- g }
- ^9 f3 A6 R7 d
: l p" Q _% t# r, e( Z' x //Method - 1 N=100000 247s + Q3 g e+ x- c. m5 |9 _/ R0 K/ ` I, S
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);5 ^: u; N+ l1 P& J( X! W$ D
2 h/ j7 Q. W% l //Method - 2 N=100000 237s
' r0 m" p5 o( `% O9 ` /** f* B/ U6 z$ B- @: f, T1 O" Z; a( c! |
for (int jj = 0; jj < N ; jj++)
: x. o f Q8 N: t* [3 P) E {: t$ D; A% g! M
fresult += vec1[jj] * vec2[jj];# @& u1 p8 A4 \ ~7 L6 _4 D2 d
}7 d( Y" h+ q0 Z& J, [4 ?
*/
& q; d4 s6 E% N+ I
1 ~. e2 Z* d" P5 |3 D% y8 Y //Method - 3 N=100000 204s
r5 l! {" s9 i2 f9 t$ ~: u /*
4 d' B9 k1 [! Q$ \ for (int jj = 0; jj < N; jj++)" k) c3 S9 T1 n, j# y- v( f |
{
8 d3 i; C J1 k! c2 S fresult += b1[jj] * b2[jj];
* M& ^! _8 E3 V8 e' x# C1 E }
2 `9 W0 u: n: p4 f) _7 L* E */( [5 Z: T( p" q0 N
: {: o* o% l% t
//Method - 4 202s$ ]! E4 [7 e" i
/*
0 N. G4 d# z- H7 m8 k+ ?% A1 v for (int jj = 0; jj < N; jj++)+ l3 d3 K* v+ d5 X9 ]8 A
{- h& R9 Z5 W& V; b: l
0 _ \* S9 f. ]: o& t- Y }! g9 D+ C4 L4 ?% j2 }8 u
*/- \& G* z0 f8 k
//comment out all methods, N=100000 202s
* z$ k( D9 @( g4 Q. T: Z5 G, t }4 y. z0 |4 v% L/ m' C6 k2 m7 \
4 F) {2 D. n0 Q2 R delete []b1;# }2 a$ K8 t8 ?, D5 T# X
delete []b2;
! `8 L5 A* P& M b0 g- p- n: Q |
|