Я работаю над кодом C++, использующим openmp в MacOS. Код обычно компилируется с помощью make-файла, и полученный двоичный файл принимает некоторые аргументы на входе и выводит массивы в виде файлов. Однако мне нужно запустить этот код много тысяч раз подряд и использовать результаты в Python, поэтому сохранение и чтение файлов с диска значительно замедляет работу. По этой причине я решил написать оболочку Python для доступа к выводам непосредственно из памяти.
Я провел небольшое исследование, и Cython показался мне лучшим вариантом для этой задачи, поэтому я приступил к работе и создал 5 файлов:
заголовок C++, определяющий класс, который собирает входные аргументы, и функцию main, которая ранее компилировалась с помощью make-файла как метод класса;
файл .cpp, содержащий фактические функции;
файл .pxd для определений в Cython;
файл .pyx, обертывающий класс из пункта 1;
файл setup.py для компиляции всего.
< /ol>
Когда я выполняю python setup.py build_ext --inplace, я получаю следующий результат:
running build_ext
building 'pyGridSPT' extension
creating build
creating build/temp.macosx-10.9-universal2-cpython-311
g++-13 -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch arm64 -arch x86_64 -g -I/opt/homebrew/include -I/Users/matteo/Documents/work/VENV_pybird/include -I/Library/Frameworks/Python.framework/Versions/3.11/include/python3.11 -c gridSPT_lib_wrapper.cpp -o build/temp.macosx-10.9-universal2-cpython-311/gridSPT_lib_wrapper.o -fopenmp -lgsl -lgslcblas -lfftw3f_omp -lfftw3f
g++-13: warning: this compiler does not support x86 ('-arch' option ignored)
In file included from gridSPT_lib.cpp:13,
from gridSPT_lib_wrapper.cpp:1237:
fielddata_v2.hpp: In instantiation of 'void FieldData::apply_filter_standard(int) [with T = float]':
gridSPT_lib.cpp:138:39: required from here
fielddata_v2.hpp:632:21: warning: unused variable 'ntasks' [-Wunused-variable]
632 | int ntasks = omp_get_num_threads();
| ^~~~~~
fielddata_v2.hpp: In instantiation of 'void FieldData::apply_filter_standard_iso(int) [with T = float]':
gridSPT_lib.cpp:140:43: required from here
fielddata_v2.hpp:683:21: warning: unused variable 'ntasks' [-Wunused-variable]
683 | int ntasks = omp_get_num_threads();
| ^~~~~~
fielddata_v2.hpp: In instantiation of 'void FieldData::apply_filter_23() [with T = float]':
gridSPT_lib.cpp:142:33: required from here
fielddata_v2.hpp:531:21: warning: unused variable 'ntasks' [-Wunused-variable]
531 | int ntasks = omp_get_num_threads();
| ^~~~~~
fielddata_v2.hpp: In instantiation of 'void FieldData::apply_filter_23_iso() [with T = float]':
gridSPT_lib.cpp:144:37: required from here
fielddata_v2.hpp:582:21: warning: unused variable 'ntasks' [-Wunused-variable]
582 | int ntasks = omp_get_num_threads();
| ^~~~~~
fielddata_v2.hpp: In instantiation of 'FieldData operator*(T, const FieldData&) [with T = float]':
gridSPT_lib.cpp:161:32: required from here
fielddata_v2.hpp:370:17: warning: unused variable 'ng' [-Wunused-variable]
370 | long long int ng = b.get_size();
| ^~
creating build/lib.macosx-10.9-universal2-cpython-311
g++-13 -bundle -undefined dynamic_lookup -arch arm64 -arch x86_64 -g build/temp.macosx-10.9-universal2-cpython-311/gridSPT_lib_wrapper.o -L/opt/homebrew/lib -o build/lib.macosx-10.9-universal2-cpython-311/pyGridSPT.cpython-311-darwin.so
g++-13: warning: this compiler does not support x86 ('-arch' option ignored)
copying build/lib.macosx-10.9-universal2-cpython-311/pyGridSPT.cpython-311-darwin.so ->
Как видите, у меня есть несколько предупреждений о неиспользуемых переменных (я считаю, что переменная «ntasks» особенно актуальна), но код компилируется без проблем. Затем в интерпретаторе Python я пытаюсь импортировать класс оболочки с помощью from pyGridSPT import pyGridSPTField, однако получаю следующую ошибку:
Traceback (most recent call last):
File "", line 1, in
ImportError: dlopen(/Users/matteo/Documents/work/repo/GridSPT/GridBSPT_RSD/second_order/python/pyGridSPT.cpython-311-darwin.so, 0x0002): symbol not found in flat namespace '_GOMP_loop_end_nowait'
Я искал в Интернете, но не нашел ничего полезного. Кажется, это проблема только в MacOS, но во всех случаях это, похоже, проблема, связанная с использованием родного Apple clang (чего я уже избегаю, я использую g++, установленный с помощью Brew ).
Из исключения я думаю, что проблема связана с тем, как openmp обрабатывается во время компиляции, однако у меня нет опыта компиляции, кроме указания путей к библиотекам. , поэтому я не уверен, как это вообще отладить. Возможно, я тоже допустил ошибку в своем классе C++, так как я новичок в C/C++.
Для справки, вот как выглядит make-файл (компилируется без проблем, двоичный файл работает безупречно):
Дайте мне знать, если мне нужно предоставить более подробную информацию.
Что я пробовал:
создал файлы, необходимые для оболочки на основе Cython;
попробовал отразить make-файл кода C++ в setup.py.
То, что я ожидал:
оболочка успешно компилируется;
оболочку можно без проблем импортировать в Python.
Что произошло на самом деле:
оболочка успешно скомпилировалась (с предупреждениями);
оболочку невозможно импортировать в Python из-за отсутствия символов (вероятно, что-то связано с openmp). li>
Я работаю над кодом C++, использующим openmp в MacOS. Код обычно компилируется с помощью make-файла, и полученный двоичный файл принимает некоторые аргументы на входе и выводит массивы в виде файлов. Однако мне нужно запустить этот код много тысяч раз подряд и использовать результаты в Python, поэтому сохранение и чтение файлов с диска значительно замедляет работу. По этой причине я решил написать оболочку Python для доступа к выводам непосредственно из памяти. Я провел небольшое исследование, и Cython показался мне лучшим вариантом для этой задачи, поэтому я приступил к работе и создал 5 файлов: [list] [*]заголовок C++, определяющий класс, который собирает входные аргументы, и функцию main, которая ранее компилировалась с помощью make-файла как метод класса; [*]файл .cpp, содержащий фактические функции; [*]файл .pxd для определений в Cython; [*]файл .pyx, обертывающий класс из пункта 1; [*]файл setup.py для компиляции всего. < /ol> Когда я выполняю python setup.py build_ext --inplace, я получаю следующий результат: [code]running build_ext building 'pyGridSPT' extension creating build creating build/temp.macosx-10.9-universal2-cpython-311 g++-13 -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch arm64 -arch x86_64 -g -I/opt/homebrew/include -I/Users/matteo/Documents/work/VENV_pybird/include -I/Library/Frameworks/Python.framework/Versions/3.11/include/python3.11 -c gridSPT_lib_wrapper.cpp -o build/temp.macosx-10.9-universal2-cpython-311/gridSPT_lib_wrapper.o -fopenmp -lgsl -lgslcblas -lfftw3f_omp -lfftw3f g++-13: warning: this compiler does not support x86 ('-arch' option ignored) In file included from gridSPT_lib.cpp:13, from gridSPT_lib_wrapper.cpp:1237: fielddata_v2.hpp: In instantiation of 'void FieldData::apply_filter_standard(int) [with T = float]': gridSPT_lib.cpp:138:39: required from here fielddata_v2.hpp:632:21: warning: unused variable 'ntasks' [-Wunused-variable] 632 | int ntasks = omp_get_num_threads(); | ^~~~~~ fielddata_v2.hpp: In instantiation of 'void FieldData::apply_filter_standard_iso(int) [with T = float]': gridSPT_lib.cpp:140:43: required from here fielddata_v2.hpp:683:21: warning: unused variable 'ntasks' [-Wunused-variable] 683 | int ntasks = omp_get_num_threads(); | ^~~~~~ fielddata_v2.hpp: In instantiation of 'void FieldData::apply_filter_23() [with T = float]': gridSPT_lib.cpp:142:33: required from here fielddata_v2.hpp:531:21: warning: unused variable 'ntasks' [-Wunused-variable] 531 | int ntasks = omp_get_num_threads(); | ^~~~~~ fielddata_v2.hpp: In instantiation of 'void FieldData::apply_filter_23_iso() [with T = float]': gridSPT_lib.cpp:144:37: required from here fielddata_v2.hpp:582:21: warning: unused variable 'ntasks' [-Wunused-variable] 582 | int ntasks = omp_get_num_threads(); | ^~~~~~ fielddata_v2.hpp: In instantiation of 'FieldData operator*(T, const FieldData&) [with T = float]': gridSPT_lib.cpp:161:32: required from here fielddata_v2.hpp:370:17: warning: unused variable 'ng' [-Wunused-variable] 370 | long long int ng = b.get_size(); | ^~ creating build/lib.macosx-10.9-universal2-cpython-311 g++-13 -bundle -undefined dynamic_lookup -arch arm64 -arch x86_64 -g build/temp.macosx-10.9-universal2-cpython-311/gridSPT_lib_wrapper.o -L/opt/homebrew/lib -o build/lib.macosx-10.9-universal2-cpython-311/pyGridSPT.cpython-311-darwin.so g++-13: warning: this compiler does not support x86 ('-arch' option ignored) copying build/lib.macosx-10.9-universal2-cpython-311/pyGridSPT.cpython-311-darwin.so -> [/code] Как видите, у меня есть несколько предупреждений о неиспользуемых переменных (я считаю, что переменная «ntasks» особенно актуальна), но код компилируется без проблем. Затем в интерпретаторе Python я пытаюсь импортировать класс оболочки с помощью from pyGridSPT import pyGridSPTField, однако получаю следующую ошибку: [code]Traceback (most recent call last): File "", line 1, in ImportError: dlopen(/Users/matteo/Documents/work/repo/GridSPT/GridBSPT_RSD/second_order/python/pyGridSPT.cpython-311-darwin.so, 0x0002): symbol not found in flat namespace '_GOMP_loop_end_nowait' [/code] Я искал в Интернете, но не нашел ничего полезного. Кажется, это проблема только в MacOS, но во всех случаях это, похоже, проблема, связанная с использованием родного Apple clang (чего я уже избегаю, я использую g++, установленный с помощью Brew ). Из исключения я думаю, что проблема связана с тем, как openmp обрабатывается во время компиляции, однако у меня нет опыта компиляции, кроме указания путей к библиотекам. , поэтому я не уверен, как это вообще отладить. Возможно, я тоже допустил ошибку в своем классе C++, так как я новичок в C/C++. Для справки, вот как выглядит make-файл (компилируется без проблем, двоичный файл работает безупречно): [code]#------------------------------------------------------
clean: rm -f $(TARGET1) rm -f $(OBJ1) rm -f *~ #----------------------------------------------------- [/code] И вот как я написал свой setup.py: [code]# compile with: python setup.py build_ext --inplace # remove build folder before recompiling
import os from setuptools import Extension, setup from Cython.Build import cythonize from distutils import sysconfig
setup(ext_modules=cythonize([extension])) [/code] Дайте мне знать, если мне нужно предоставить более подробную информацию. Что я пробовал:
[*]создал файлы, необходимые для оболочки на основе Cython; [*]попробовал отразить make-файл кода C++ в setup.py.[/list] То, что я ожидал: [list] [*]оболочка успешно компилируется; [*]оболочку можно без проблем импортировать в Python. [/list] Что произошло на самом деле: [list] [*]оболочка успешно скомпилировалась (с предупреждениями); оболочку невозможно импортировать в Python из-за отсутствия символов (вероятно, что-то связано с openmp). li> [/list]
Я использую pyenv для управления версиями Python.
Когда я использую Python 3.12.4 или Python3.9^, я получаю следующую ошибку:
File src/pymssql/_pymssql.pyx , line 1, in init pymssql._pymssql
ImportError:...
Я использую кластер Kubernetes с RKE2 v1.30.5+RKE2R1 на Linux Nixos 6.6.56 AMD64, используя Clium cni.
Вот настройка:
У меня есть две стручки (yaml manifests внизу): pods (yaml manifests внизу): pods (yaml manifests at снизу): (xfrm-pod) работает...
У меня есть проект на C++&cmake, в котором я использую действия GitHub для сборки и тестирования на последних платформах Ubuntu 22.04 и Windows.
К сожалению, последняя версия Windows компоновщик завершается с ошибкой
LINK : fatal error LNK1181:...
У меня есть 2 массива: один получен из базы данных (сохраненные результаты), а другой — из XML (новые результаты).
$fromDB = array('123','124','524','15','616');
$fromXML = array('123','124','524','15','818');