2013-05-14 13 views
8

Sto lavorando su un progetto python che utilizza cython e c per velocizzare le operazioni time-sensitive. In alcune delle nostre routine cython, usiamo openmp per accelerare ulteriormente un'operazione se sono disponibili core inattivi.Test a livello di programmazione per il supporto openmp da uno script di installazione python

Questo porta a un po 'di una situazione fastidiosa su OS X dal momento che il compilatore di default per le versioni recenti del sistema operativo (llvm/clang su 10.7 e 10.8) non supporta openmp. La nostra soluzione di stopgap è di dire alle persone di impostare gcc come compilatore quando costruiscono. Ci piacerebbe molto farlo a livello di programmazione poiché clang può costruire tutto il resto senza problemi.

In questo momento, la compilazione fallirà con il seguente errore:

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 

La parte rilevante del nostro script di installazione si presenta così:

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"]) 

Il file completo setup.py è here.

Esiste un modo per verificare a livello di programmazione il supporto per openmp dallo script di installazione?

risposta

0

sono stato in grado di ottenere questo lavoro controllando per vedere se un programma di test compila:

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 questi giorni la nostra soluzione è un po 'più sofisticato, ma fa uso della stessa idea di base: compilare un programma di test e vedere se funziona correttamente. Inoltre, colleghiamo e testiamo per essere più sicuri. Vedi https://github.com/astropy/astropy-helpers/blob/master/astropy_helpers/openmp_helpers.py – ngoldbaum

Problemi correlati