@@ -5,9 +5,24 @@ use rand_distr::Distribution;
55use rayon:: ThreadPool ;
66use rayon:: ThreadPoolBuilder ;
77use stochastic_rs:: distributions:: DistributionSampler ;
8+ use stochastic_rs:: distributions:: alpha_stable:: SimdAlphaStable ;
9+ use stochastic_rs:: distributions:: beta:: SimdBeta ;
10+ use stochastic_rs:: distributions:: binomial:: SimdBinomial ;
11+ use stochastic_rs:: distributions:: cauchy:: SimdCauchy ;
12+ use stochastic_rs:: distributions:: chi_square:: SimdChiSquared ;
813use stochastic_rs:: distributions:: exp:: SimdExp ;
14+ use stochastic_rs:: distributions:: gamma:: SimdGamma ;
15+ use stochastic_rs:: distributions:: geometric:: SimdGeometric ;
16+ use stochastic_rs:: distributions:: hypergeometric:: SimdHypergeometric ;
17+ use stochastic_rs:: distributions:: inverse_gauss:: SimdInverseGauss ;
18+ use stochastic_rs:: distributions:: lognormal:: SimdLogNormal ;
919use stochastic_rs:: distributions:: normal:: SimdNormal ;
20+ use stochastic_rs:: distributions:: normal_inverse_gauss:: SimdNormalInverseGauss ;
21+ use stochastic_rs:: distributions:: pareto:: SimdPareto ;
1022use stochastic_rs:: distributions:: poisson:: SimdPoisson ;
23+ use stochastic_rs:: distributions:: studentt:: SimdStudentT ;
24+ use stochastic_rs:: distributions:: uniform:: SimdUniform ;
25+ use stochastic_rs:: distributions:: weibull:: SimdWeibull ;
1126use stochastic_rs:: simd_rng:: SimdRng ;
1227
1328fn median_ms ( samples : & mut [ f64 ] ) -> f64 {
@@ -132,7 +147,7 @@ where
132147 let speedup = t1 / tn;
133148 let values = m * n;
134149 println ! (
135- "{name:>12 } | m={m:<5} n={n:<5} values={values:<10} | 1T={t1:>8.2} ms | MT={tn:>8.2} ms | speedup={speedup:>5.2}x"
150+ "{name:>18 } | m={m:<5} n={n:<5} values={values:<10} | 1T={t1:>8.2} ms | MT={tn:>8.2} ms | speedup={speedup:>5.2}x"
136151 ) ;
137152}
138153
@@ -155,30 +170,184 @@ fn main() {
155170 println ! ( ) ;
156171
157172 run_case (
158- "Normal<f64>" ,
173+ "Normal<f64>(ref) " ,
159174 & SimdNormal :: < f64 > :: new ( 0.0 , 1.0 ) ,
160175 2048 ,
161176 2048 ,
162177 & single,
163178 & multi,
164179 ) ;
165180 run_case (
166- "Exp<f64>" ,
181+ "Exp<f64>(ref) " ,
167182 & SimdExp :: < f64 > :: new ( 1.5 ) ,
168183 2048 ,
169184 2048 ,
170185 & single,
171186 & multi,
172187 ) ;
173188 run_case (
174- "Poisson<i64>" ,
189+ "Poisson<i64>(ref) " ,
175190 & SimdPoisson :: < i64 > :: new ( 1.5 ) ,
176191 2048 ,
177192 2048 ,
178193 & single,
179194 & multi,
180195 ) ;
181196
197+ println ! ( ) ;
198+ println ! ( "All built-in distributions sample_matrix benchmark" ) ;
199+ println ! ( "(sizes tuned to keep runtime practical for heavier discrete samplers)" ) ;
200+ let fm = 1024usize ;
201+ let fnn = 1024usize ;
202+ let im = 512usize ;
203+ let inn = 512usize ;
204+
205+ run_case (
206+ "Normal<f64>" ,
207+ & SimdNormal :: < f64 > :: new ( 0.0 , 1.0 ) ,
208+ fm,
209+ fnn,
210+ & single,
211+ & multi,
212+ ) ;
213+ run_case (
214+ "Exp<f64>" ,
215+ & SimdExp :: < f64 > :: new ( 1.5 ) ,
216+ fm,
217+ fnn,
218+ & single,
219+ & multi,
220+ ) ;
221+ run_case (
222+ "Uniform<f64>" ,
223+ & SimdUniform :: < f64 > :: new ( 0.0 , 1.0 ) ,
224+ fm,
225+ fnn,
226+ & single,
227+ & multi,
228+ ) ;
229+ run_case (
230+ "Cauchy<f64>" ,
231+ & SimdCauchy :: < f64 > :: new ( 0.0 , 1.0 ) ,
232+ fm,
233+ fnn,
234+ & single,
235+ & multi,
236+ ) ;
237+ run_case (
238+ "LogNormal<f64>" ,
239+ & SimdLogNormal :: < f64 > :: new ( 0.2 , 0.8 ) ,
240+ fm,
241+ fnn,
242+ & single,
243+ & multi,
244+ ) ;
245+ run_case (
246+ "Gamma<f64>" ,
247+ & SimdGamma :: < f64 > :: new ( 2.0 , 2.0 ) ,
248+ fm,
249+ fnn,
250+ & single,
251+ & multi,
252+ ) ;
253+ run_case (
254+ "ChiSq<f64>" ,
255+ & SimdChiSquared :: < f64 > :: new ( 5.0 ) ,
256+ fm,
257+ fnn,
258+ & single,
259+ & multi,
260+ ) ;
261+ run_case (
262+ "StudentT<f64>" ,
263+ & SimdStudentT :: < f64 > :: new ( 5.0 ) ,
264+ fm,
265+ fnn,
266+ & single,
267+ & multi,
268+ ) ;
269+ run_case (
270+ "Beta<f64>" ,
271+ & SimdBeta :: < f64 > :: new ( 2.0 , 2.0 ) ,
272+ fm,
273+ fnn,
274+ & single,
275+ & multi,
276+ ) ;
277+ run_case (
278+ "Weibull<f64>" ,
279+ & SimdWeibull :: < f64 > :: new ( 1.0 , 1.5 ) ,
280+ fm,
281+ fnn,
282+ & single,
283+ & multi,
284+ ) ;
285+ run_case (
286+ "Pareto<f64>" ,
287+ & SimdPareto :: < f64 > :: new ( 1.0 , 1.5 ) ,
288+ fm,
289+ fnn,
290+ & single,
291+ & multi,
292+ ) ;
293+ run_case (
294+ "InvGauss<f64>" ,
295+ & SimdInverseGauss :: < f64 > :: new ( 1.0 , 2.0 ) ,
296+ fm,
297+ fnn,
298+ & single,
299+ & multi,
300+ ) ;
301+ run_case (
302+ "NIG<f64>" ,
303+ & SimdNormalInverseGauss :: < f64 > :: new ( 2.0 , 0.5 , 1.0 , 0.0 ) ,
304+ fm,
305+ fnn,
306+ & single,
307+ & multi,
308+ ) ;
309+ run_case (
310+ "AlphaStable<f64>" ,
311+ & SimdAlphaStable :: < f64 > :: new ( 1.7 , 0.3 , 1.0 , 0.0 ) ,
312+ fm,
313+ fnn,
314+ & single,
315+ & multi,
316+ ) ;
317+
318+ run_case (
319+ "Poisson<i64>" ,
320+ & SimdPoisson :: < i64 > :: new ( 2.5 ) ,
321+ fm,
322+ fnn,
323+ & single,
324+ & multi,
325+ ) ;
326+ run_case (
327+ "Geometric<u64>" ,
328+ & SimdGeometric :: < u64 > :: new ( 0.3 ) ,
329+ fm,
330+ fnn,
331+ & single,
332+ & multi,
333+ ) ;
334+ run_case (
335+ "Binomial<u32>" ,
336+ & SimdBinomial :: < u32 > :: new ( 32 , 0.3 ) ,
337+ im,
338+ inn,
339+ & single,
340+ & multi,
341+ ) ;
342+ run_case (
343+ "Hypergeo<u32>" ,
344+ & SimdHypergeometric :: < u32 > :: new ( 500 , 80 , 32 ) ,
345+ im,
346+ inn,
347+ & single,
348+ & multi,
349+ ) ;
350+
182351 println ! ( ) ;
183352 println ! ( "Normal fill_slice benchmark (single-thread)" ) ;
184353 println ! ( "Reference A: rand_distr + SimdRng (fair algorithm compare)" ) ;
0 commit comments