Wie kann ich verschiedene Compiler-Flags in Distutils für nur eine Python / C-Erweiterungsdatei angeben?

8

Ich habe eine Python-Erweiterung, die CPU-spezifische Funktionen verwendet, wenn verfügbar. Dies geschieht durch eine Laufzeitprüfung. Wenn die Hardware unterstützt den POPCNT-Befehl und wählt dann einen aus Implementierung meiner inneren Schleife, wenn SSSE3 dann verfügbar ist es wählt ein anderes aus, ansonsten greift es auf generische Versionen zurück meines leistungskritischen Kernels. (Etwa 95% der Zeit ist in diesem Kernel verbracht.)

Leider gibt es einen Fehlermodus, den ich nicht erwartet habe. ich Verwenden Sie -mssse3 und -O3, um den gesamten C-Code zu kompilieren, obwohl Nur eine Datei benötigt die Option -mssse3.

Als Ergebnis werden die anderen Dateien mit der Erwartung kompiliert dass SSSE3 existiert. Dies verursacht einen segfault für die Zeile

%Vor%

, weil der Compiler fisttpl verwendet hat, was eine SSSE-3-Anweisung ist. Immerhin habe ich ihm gesagt, dass ssse3 existiert.

Der Debian-Packager für mein Paket ist kürzlich auf dieses Problem gestoßen, weil die Testmaschine einen gcc hat, der -mssse3 und generieren Code mit diesem Gedanken, aber die Maschine selbst hat eine ältere CPU ohne diese Anweisungen.

Ich möchte eine Lösung, bei der dieselbe Binärdatei auf älteren Maschinen funktionieren kann und auf neueren, die der Debian-Betreuer für diese Distribution verwenden kann.

Idealerweise würde ich sagen, dass nur eine Datei kompiliert wird mit der Option -mssse3. Seit meinem CPU-spezifischen Selektor-Code Ist kein Teil dieser Datei, wird niemals ein SSSE-3-Code ausgeführt sofern die CPU dies nicht unterstützt.

Ich kann jedoch keine Möglichkeit finden, Distuts davon zu erzählen Eine Reihe von Compileroptionen sind spezifisch für eine einzelne Datei.

Ist das überhaupt möglich?

    
Andrew Dalke 20.03.2013, 15:20
quelle

1 Antwort

5

Eine sehr hässliche Lösung wäre, zwei (oder mehr Extension ) Klassen zu erstellen, eine für den SSSE3-Code und die andere für alles andere. Sie könnten dann die Schnittstelle in der Python-Schicht aufräumen.

%Vor%

und in einem __init__.py irgendwo

%Vor%

Natürlich brauchst du nicht, dass ich diesen Code schreibe! Und ich weiß, das ist nicht trocken, ich freue mich darauf, eine bessere Antwort zu lesen!

    
danodonovan 20.03.2013 15:46
quelle

Tags und Links