Skip to content
Snippets Groups Projects
Commit 06b841b9 authored by Pierre Augier's avatar Pierre Augier
Browse files

Add figure microbench (fluidfft).

parent de529f74
No related branches found
No related tags found
No related merge requests found
......@@ -28,7 +28,7 @@
doit: vimtex $(name).pdf
zathura $(name).pdf &
figures: $(figures)
figures: tmp/fig_microbench.pdf
cd python && python makefile_figures.py
$(name).pdf: figures $(name).log
......@@ -45,3 +45,6 @@
$(name).aux: $(name).tex
$(LATEX) $(name).tex
tmp/fig_microbench.pdf:
python microbench/make_fig_bar.py save
......@@ -486,6 +486,78 @@
Description of few microbenchmarks in directories in
\codeinline{fluidfft/bench}.
The naive version:
\begin{minted}[fontsize=\footnotesize]{python}
# pythran export proj(
# complex128[][][], complex128[][][], complex128[][][],
# float64[][][], float64[][][], float64[][][], float64[][][])
def proj(vx, vy, vz, kx, ky, kz, inv_k_square_nozero):
tmp = (kx * vx + ky * vy + kz * vz) * inv_k_square_nozero
return vx - kx * tmp, vy - ky * tmp, vz - kz * tmp
\end{minted}
The ``inplace'' version:
\begin{minted}[fontsize=\footnotesize]{python}
# pythran export proj_inplace(
# complex128[][][], complex128[][][], complex128[][][],
# float64[][][], float64[][][], float64[][][], float64[][][])
def proj_inplace(vx, vy, vz, kx, ky, kz, inv_k_square_nozero):
tmp = (kx * vx + ky * vy + kz * vz) * inv_k_square_nozero
vx -= kx * tmp
vy -= ky * tmp
vz -= kz * tmp
\end{minted}
The ``inplace'' version with explicit loops:
\begin{minted}[fontsize=\footnotesize]{python}
# pythran export proj_inplace_loop(
# complex128[][][], complex128[][][], complex128[][][],
# float64[][][], float64[][][], float64[][][], float64[][][])
def proj_inplace_loop(vx, vy, vz, kx, ky, kz, inv_k_square_nozero):
n0, n1, n2 = kx.shape
for i0 in range(n0):
for i1 in range(n1):
for i2 in range(n2):
tmp = (kx[i0, i1, i2] * vx[i0, i1, i2]
+ ky[i0, i1, i2] * vy[i0, i1, i2]
+ kz[i0, i1, i2] * vz[i0, i1, i2]
) * inv_k_square_nozero[i0, i1, i2]
vx[i0, i1, i2] -= kx[i0, i1, i2] * tmp
vy[i0, i1, i2] -= ky[i0, i1, i2] * tmp
vz[i0, i1, i2] -= kz[i0, i1, i2] * tmp
\end{minted}
\begin{figure}[htp]
\centering
\includegraphics[width=\linewidth]{tmp/fig_microbench}
\caption{Time elapsed (smaller is better) for the projection function for
different implementations and tools. }
\label{fig:microbench}
\end{figure}
Figure~\ref{fig:microbench} shows...
Pythran is able to speedup the numpy code and is as fast as Fortran (even slightly
faster) with the codes with explicit loops.
Numba is not able to speedup the numpy code. It is significantly slower than
Pythran and Fortran with the codes with explicit loops.
\section*{Quality control}
......
......@@ -31,8 +31,8 @@
perfnumba:
# numba proj
@python -m perf timeit -s 'from bench import proj_numba $(end)' $(code)
# numba proj_inplace
@python -m perf timeit -s 'from bench import proj_inplace_numba $(end)' $(code)
@# numba proj
@# python -m perf timeit -s 'from bench import proj_numba $(end)' $(code)
@# numba proj_inplace
@# python -m perf timeit -s 'from bench import proj_inplace_numba $(end)' $(code)
# numba proj_loop
......@@ -38,7 +38,7 @@
# numba proj_loop
@python -m perf timeit -s 'from bench import proj_loop_numba $(end)' $(code)
@ python -m perf timeit -s 'from bench import proj_loop_numba $(end)' $(code)
# numba proj_inplace_loop
@python -m perf timeit -s 'from bench import proj_inplace_loop_numba $(end)' $(code)
proj_pythran.so: proj.py
......@@ -40,9 +40,9 @@
# numba proj_inplace_loop
@python -m perf timeit -s 'from bench import proj_inplace_loop_numba $(end)' $(code)
proj_pythran.so: proj.py
pythran -v proj.py -march=native -o proj_pythran.so
pythran -v proj.py -march=native -DUSE_BOOST_SIMD -o proj_pythran.so
perffortran: bench_proj_fortran.out bench_proj_fortran_inplace.out
......
......@@ -19,6 +19,7 @@
Mean +- std dev: 66.6 ms +- 0.7 ms
### pythran proj
Mean +- std dev: 36.2 ms +- 0.8 ms
Mean +- std dev: 38.8 ms +- 3.1 ms
### pythran proj_loop
......@@ -22,6 +23,7 @@
Mean +- std dev: 38.8 ms +- 3.1 ms
### pythran proj_loop
Mean +- std dev: 19.1 ms +- 1.0 ms
Mean +- std dev: 19.8 ms +- 1.4 ms
### numba proj
......@@ -25,7 +27,7 @@
Mean +- std dev: 19.8 ms +- 1.4 ms
### numba proj
Mean +- std dev: 78.3 ms +- 2.0 ms
Mean +- std dev: 78.1 ms +- 2.0 ms
### numba proj_loop
Mean +- std dev: 26.5 ms +- 2.5 ms
......@@ -29,6 +31,7 @@
### numba proj_loop
Mean +- std dev: 26.5 ms +- 2.5 ms
Mean +- std dev: 24.4 ms +- 0.2 ms
## inplace
......@@ -40,6 +43,7 @@
Mean +- std dev: 54.2 ms +- 2.4 ms
### pythran proj_inplace
Mean +- std dev: 18.3 ms +- 1.1 ms
Mean +- std dev: 18.7 ms +- 0.8 ms
### pythran proj_inplace_loop
......@@ -43,6 +47,7 @@
Mean +- std dev: 18.7 ms +- 0.8 ms
### pythran proj_inplace_loop
Mean +- std dev: 8.41 ms +- 0.52 ms
Mean +- std dev: 8.60 ms +- 0.08 ms
### numba proj_inplace
......@@ -50,3 +55,5 @@
### numba proj_inplace_loop
Mean +- std dev: 16.3 ms +- 1.5 ms
Mean +- std dev: 15.8 ms +- 2.6 ms
Mean +- std dev: 14.6 ms +- 0.9 ms
......@@ -7,10 +7,7 @@
def proj(vx, vy, vz, kx, ky, kz, inv_k_square_nozero):
tmp = (kx * vx + ky * vy + kz * vz) * inv_k_square_nozero
return (vx - kx * tmp,
vy - ky * tmp,
vz - kz * tmp)
return vx - kx * tmp, vy - ky * tmp, vz - kz * tmp
# pythran export proj_loop(
# complex128[][][], complex128[][][], complex128[][][],
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment