[pythran] Re: Cython vs Pythran on a very simple function

  • From: PIERRE AUGIER <pierre.augier@xxxxxxxxxxxxxxxxxxxxxx>
  • To: pythran@xxxxxxxxxxxxx
  • Date: Fri, 28 Apr 2017 19:09:12 +0200 (CEST)

Hello,

Adding the lines 

[pythran]
complex_hook = True

in ~/.pythranrc solves the problem. Pythran gets slightly faster than Cython on 
my machine too.

Thank you for your quick reply.

Pierre


----- Mail original -----

De: "serge guelton" <serge.guelton@xxxxxxxxxxxxxxxxxxx>
À: pythran@xxxxxxxxxxxxx
Envoyé: Vendredi 28 Avril 2017 16:11:13
Objet: [pythran] Re: Cython vs Pythran on a very simple function

On Fri, Apr 28, 2017 at 01:39:14PM +0200, PIERRE AUGIER wrote:
Hello,

I compare Cython and Pythran on a very simple function and I am a little bit
disappointed by what I get:

# pythran export gradfft_from_fft(complex128[][], float64[][], float64[][])

def gradfft_from_fft(f_fft, KX, KY):
    px_f_fft = 1j * KX * f_fft
    py_f_fft = 1j * KY * f_fft
    return px_f_fft, py_f_fft

I focussed on what we can get only with one core (no OpenMP).

The cython version with @cython.boundscheck(False) and 
@cython.wraparound(False)
is faster than the pythranized function. Pythran is "only" as good as Cython
without @cython.boundscheck(False) and @cython.wraparound(False)...

The code is here:
https://bitbucket.org/fluiddyn/fluidfft/src/88c55f8ed44ef33a01e3f532518b4ba44672aab1/scripts/compare_cypythran/?at=default

Can Pythran reach the performance of Cython in this case?

Hi Pierre and thanks for providing a detailed way to reproduce your
performance issue. It turns out I cannot reproduce your issue. Here is
the outcome of running your bench on my laptop:

   # python
   python -m perf timeit -s 'from bench import gradfft_from_fft_py as g, 
f_fft, KX,
   KY' 'g(f_fft, KX, KY)'
   .....................
   Median +- std dev: 23.0 ms +- 0.1 ms
   # pythran
   python -m perf timeit -s 'from bench import gradfft_from_fft as g, f_fft, 
KX,
   KY' 'g(f_fft, KX, KY)'
   .....................
   Median +- std dev: 10.2 ms +- 0.1 ms
   # cython with @cython.boundscheck(False) @cython.wraparound(False)
   python -m perf timeit -s 'from bench import gradfft_from_fft_nocheck_cy as 
g,
   f_fft, KX, KY' 'g(f_fft, KX, KY)'
   .....................
   Median +- std dev: 13.5 ms +- 0.3 ms
   # cython without @cython.boundscheck(False) @cython.wraparound(False)
   python -m perf timeit -s 'from bench import gradfft_from_fft_check_cy as g,
   f_fft, KX, KY' 'g(f_fft, KX, KY)'
   .....................
   Median +- std dev: 15.3 ms +- 0.8 ms

As your code uses complex number, I activated the following in my
.pythranrc:

   [pythran]
   complex_hook = True

Without this, complex multiplication is more accurate with respect to
NaN and inf, but slower. Even without it, I get roughly the same perf
between cython with bound checks and pythran.

I'm using gcc6 and that may be the key difference between our two
setups?

Other related posts: