Cython vs numpy Leistungsskalierung

8

Ich habe mit Cython in Vorbereitung auf andere Arbeiten gespielt. Ich habe einen einfachen Testfall ausprobiert und dabei festgestellt, dass mein Code bei größeren Problemgrößen etwas merkwürdig ist. Ich habe eine einfache Min / Max-Funktion erstellt, die den minimalen und maximalen Wert eines 2D-float32-Arrays berechnet und mit dem Ausführen von numpy.min(a), numpy.max(a) vergleicht. Für ein Array von 10000 Elementen war die Leistung ähnlich. Bei einem Array von 1000000 Elementen schnitt das Cython viel schlechter ab. Hier ist mein Cython-Code:

%Vor%

Und hier ist mein einfaches Timing in ipython:

%Vor%

Hat jemand Ideen dafür, warum Cython für den größeren Input so viel länger braucht? Und das war nur etwas, mit dem ich spielte, aber wenn Sie irgendwelche Tipps oder Tricks haben, bin ich daran interessiert, sie zu hören. Vielen Dank im Voraus.

Bearbeiten: Ich habe diese Tests auf einem MacBook 10.10 mit 8 GB Arbeitsspeicher ausgeführt. Kompiliert das Cython mit gcc von Macports mit den Flags, die in ihren Tutorials -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing erwähnt wurden.

    
daveydave400 19.12.2014, 23:35
quelle

2 Antworten

2

Es sieht so aus, als ob NumPy SSE-Anweisungen verwendet, wenn diese für min und max verfügbar sind, was bedeutet, dass sie Ihre Hardware wahrscheinlich in viel größerem Umfang nutzen können, als Cython erreichen kann.

Hier ist der Quellcode für NumPys min und max Reduktionsimplementierungen in SSE: Ссылка . Beachten Sie, dass sie einen Präprozessor verwenden, um automatisch Code für mehrere Datentypen und Operationen gleichzeitig zu generieren.

    
nneonneo 20.12.2014, 08:08
quelle
1

Erstens, um Verwirrung zu vermeiden, ist es nie eine gute Idee, die eingebauten Funktionsnamen min und max als Variablennamen zu verwenden, also rufe fmin und fmax auf.

Grundsätzlich ist es wichtig, daran zu denken, dass numpy stark optimiert ist, Sie könnten auch versuchen, in Ihrem Cython zu ändern:

%Vor%

zu:

%Vor%

und Hinzufügen der Definition: cdef DTYPE_t val

Dies reduziert die Anzahl der Array-Index-Operationen von 4 auf 1.

Sie können auch versuchen:

%Vor%

, da es eine Verbesserung zeigen kann.

Sie können x, y, row_max und row_min auch zu unsignierten -Ints machen und die Überprüfung der Grenzen ausschalten, indem Sie den Funktionsdekorator @cython.boundscheck(False) # turn of bounds-checking for entire function

hinzufügen

Dieses Tutorial ist es wert, gelesen zu werden.

    
Steve Barnes 20.12.2014 07:53
quelle

Tags und Links