Я пытаюсь использовать OpenMP в списке python объектов с помощью Pybind11 в C ++. Я преобразую этот список в std :: vector из Python объектов (как объяснено в в этом посте ), а затем пытаюсь получить к ним параллельный доступ для l oop. Однако при вызове атрибутов любого python объекта в векторе для l oop я получаю сообщение об ошибке:
Fatal Python error: deletion of interned string failed
Thread 0x00007fd282bc7700 (most recent call first):
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
Мои вопросы: Что такое удаление ошибки интернированной строки? и как этого избежать в OpenMP?
Я прочитал здесь , что проблема связана с копией строки, поэтому я попытался сослаться на строку с указателем, но это не помогло. Кроме того, проблема не связана с проблемой преобразования в Pybind, потому что, если я удалю предложение #pragma omp, код будет работать отлично.
Любая помощь будет чрезвычайно полезна.
C ++ Код
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <omp.h>
#include <chrono>
#include <thread>
namespace py = pybind11;
py::object create_seq(
py::object self
){
std::vector<py::object> dict = self.cast<std::vector<py::object>>();
#pragma omp parallel for
for(unsigned int i=0; i<dict.size(); i++) {
dict[i].attr("attribute") = 2;
}
return self;
}
PYBIND11_MODULE(error, m){
m.doc() = "pybind11 module for iterating over generations";
m.def("create_seq", &create_seq,
"the function which creates a sequence");
}
Python Код
import error
class test():
def __init__(self):
self.attribute = None
if __name__ == '__main__':
dict = {}
for i in range(50):
dict[i] = test()
pop = error.create_seq(list(dict.values()))
Составлено с:
g++ -O3 -Wall -shared -std=c++14 -fopenmp -fPIC `python3 -m pybind11 --includes` openmp.cpp -o error.so