Я пишу библиотеку, которая имеет несколько модулей, написанных на Cython, и интенсивно использует параллелизм с использованием модуля openmp
.Библиотеку можно использовать на любой платформе - Unix / Mac / Windows.
Из-за этого мне нужно добавить флаги компилятора в определение модуля, чтобы она компилировалась с openmp
.Только для Linux и Mac, я сделал что-то вроде этого:
Extension('my.module', ['my/module.c'],
extra_compile_args=['-fopenmp', '-O3'],
extra_link_args=['-fopenmp', '-O3'],
),
Однако это не работает в Windows, так как msvcc имеет другой формат для директив, то есть -fopenmp
заменяется на /openmp
и -O3
заменяется на /O3
.Мое текущее решение заключается в следующем:
IS_WINDOWS = 'win' in sys.platform
openmp_opt = '/openmp' if IS_WINDOWS else '-fopenmp'
optim_opt = '/O3' if IS_WINDOWS else '-O3'
Extension('my.module', ['my/module.c'],
extra_compile_args=[openmp_opt, optim_opt],
extra_link_args=[openmp_opt, optim_opt],
),
Это работает, насколько я могу проверить.У него есть одна проблема: msvcc
не требует extra_link_args
, но gcc
делает.Поэтому при компиляции в Windows я получаю предупреждения компоновщика о том, что /O3
и /openmp
распознаются.
Мой вопрос такой: есть ли лучший способ сделать это, встроенный в Cython, которого я не нашела также, есть ли случай, который я пропустил, т.е. есть ли другие компиляторы, о которых мне нужно беспокоиться, или проверка Windows достаточно хороша?