2013-05-14 6 views
8

Ich arbeite an einem Python-Projekt, das Cython und c verwendet, um zeitkritische Vorgänge zu beschleunigen. In einigen unserer Cython-Routinen verwenden wir openmp, um eine Operation weiter zu beschleunigen, wenn freie Kerne verfügbar sind.Programmgesteuertes Testen der Unterstützung von Openmp durch ein Python-Setup-Skript

Dies führt zu einer etwas nervigen Situation unter OS X, da der Standard-Compiler für aktuelle OS-Versionen (llvm/clang auf 10.7 und 10.8) kein openmp unterstützt. Unsere Stopgap-Lösung soll Leuten sagen, gcc als ihren Compiler zu setzen, wenn sie bauen. Wir würden das gerne programmatisch machen, da Clam alles andere ohne Probleme aufbauen kann.

Gerade jetzt, Kompilierung wird mit dem folgenden Fehler fehlschlagen:

clang: error: linker command failed with exit code 1 (use -v to see invocation) 
error: Command "cc -bundle -undefined dynamic_lookup -L/usr/local/lib -L/usr/local/opt/sqlite/lib build/temp.macosx-10.8-x86_64-2.7/yt/utilities/lib/geometry_utils.o -lm -o yt/utilities/lib/geometry_utils.so -fopenmp" failed with exit status 1 

Der relevante Teil unserer Setup-Skript sieht wie folgt aus:

config.add_extension("geometry_utils", 
     ["yt/utilities/lib/geometry_utils.pyx"], 
     extra_compile_args=['-fopenmp'], 
     extra_link_args=['-fopenmp'], 
     libraries=["m"], depends=["yt/utilities/lib/fp_utils.pxd"]) 

Die vollständige setup.py-Datei ist here.

Gibt es eine Möglichkeit programmgesteuert für die Unterstützung von Openmp aus dem Setup-Skript zu testen?

Antwort

0

konnte ich diese Arbeit bekommen durch, wenn ein Testprogramm kompiliert, um zu sehen Kontrolle:

import os, tempfile, subprocess, shutil  

# see http://openmp.org/wp/openmp-compilers/ 
omp_test = \ 
r""" 
#include <omp.h> 
#include <stdio.h> 
int main() { 
#pragma omp parallel 
printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads()); 
} 
""" 

def check_for_openmp(): 
    tmpdir = tempfile.mkdtemp() 
    curdir = os.getcwd() 
    os.chdir(tmpdir) 

    filename = r'test.c' 
    with open(filename, 'w', 0) as file: 
     file.write(omp_test) 
    with open(os.devnull, 'w') as fnull: 
     result = subprocess.call(['cc', '-fopenmp', filename], 
           stdout=fnull, stderr=fnull) 

    os.chdir(curdir) 
    #clean up 
    shutil.rmtree(tmpdir) 

    return result 
+0

In diesen Tagen unsere Lösung ein etwas anspruchsvoller ist aber die Verwendung der gleichen Grundidee macht: ein Testprogramm zusammenstellen und Schau, ob das richtig funktioniert. Wir verlinken und testen, um besonders sicher zu sein. Siehe https://github.com/astropy/astropy-helpers/blob/master/astropy_helpers/openmp_helpers.py – ngoldbaum