Pracuję nad projektem Pythona, który używa cython i c, aby przyspieszyć operacje wrażliwe na czas. W kilku naszych procedurach cytonowych używamy openmp, aby jeszcze bardziej przyspieszyć operację, jeśli dostępne są wolne rdzenie.Programowe testowanie obsługi OpenMP ze skryptu konfiguracyjnego Pythona
Prowadzi to do nieco irytującej sytuacji w systemie OS X, ponieważ domyślny kompilator dla najnowszych wersji systemu operacyjnego (llvm/clang w wersji 10.7 i 10.8) nie obsługuje OpenMP. Nasze rozwiązanie typu "stopgap" polega na informowaniu ludzi o ustawieniu gcc jako kompilatora podczas kompilacji. Chcielibyśmy zrobić to programowo, ponieważ klang może budować wszystko inne bez problemów.
Teraz kompilacja nie powiedzie się z powodu następującego błędu:
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
Odpowiednia część naszego skryptu instalacyjnego wygląda następująco:
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"])
Pełne plik setup.py jest here.
Czy istnieje sposób programowego testowania obsługi OpenMP z poziomu skryptu instalacyjnego?
Te dni nasze rozwiązanie jest nieco bardziej skomplikowany, ale sprawia, że korzystanie z tej samej podstawowej idei: skompilować program testowy i zobacz, czy to działa poprawnie. Łączymy się i testujemy, aby być pewnym. Zobacz https://github.com/astropy/astropy-helpers/blob/master/astropy_helpers/openmp_helpers.py – ngoldbaum