Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python中的OpenMP调用C函数会导致最后出现分段错误_Python_C_Multithreading_Segmentation Fault_Openmp - Fatal编程技术网

使用Python中的OpenMP调用C函数会导致最后出现分段错误

使用Python中的OpenMP调用C函数会导致最后出现分段错误,python,c,multithreading,segmentation-fault,openmp,Python,C,Multithreading,Segmentation Fault,Openmp,我编写了一个Python脚本,它调用一个C函数,该函数使用OpenMP并行化,从Python到C函数的变量使用ctypes包装器传递。C功能正常工作,产生所需的输出。但是我在Python代码的末尾遇到了一个分段错误。我怀疑这与OpenMP生成的线程有关,因为禁用OpenMP时不会出现seg故障 在调用外部C函数的代码的Python端,我有: ... C_Func = ctypes.cdll.LoadLibrary ('./Cinterface.so') C_Func.Receive_Param

我编写了一个Python脚本,它调用一个C函数,该函数使用OpenMP并行化,从Python到C函数的变量使用ctypes包装器传递。C功能正常工作,产生所需的输出。但是我在Python代码的末尾遇到了一个分段错误。我怀疑这与OpenMP生成的线程有关,因为禁用OpenMP时不会出现seg故障

在调用外部C函数的代码的Python端,我有:

...
C_Func = ctypes.cdll.LoadLibrary ('./Cinterface.so')

C_Func.Receive_Parameters.argtypes = (...list of ctypes variable-type ...)
C_Func.Receive_Parameters.restype = ctypes.c_void_p

C_Func.Perform_Calculation.argtypes = ( )
C_Func.Perform_Calculation.restypes = ctypes.c_void_p
在C端,函数的一般形式是:

void Receive_Parameters (....list of c variable-type ...)
{
  ---Take all data and parameters coming from python---
  return;
}

void Perform_Calculation ( )
{

#pragma omp parallel default(shared) num_threads(8) private (....)
{
  #pragma omp for schedule (static, 1) reduction (+:p)
    p+= core_calculation (...list of variables....)
}
  return;
}


float core_calculation (...list of variables...)
{
  ----all calculations done here-----
}
我有以下问题和相关的困惑:

Python对C函数中OpenMP生成的线程的操作有控制权吗?我问这个问题的原因是C函数接收指向Python在堆中分配的数组的指针。OpenMP线程是否可以并行执行此阵列上的操作,而不必担心它的分配位置

在调用C函数之前,我是否需要在Python代码中执行任何操作,比如释放GIL以允许在C函数中生成OpenMP线程?如果是,如何做到这一点

在OpenMP并行块之前,我必须释放C函数中的GIL吗


< P>我有Pythg,C和C++包装生成器,用于Python和其他语言,为我组织吉尔版本。生成的代码看起来并不琐碎,并且正在使用新的发布/获取技术。然而,PEP中解释的旧技术可能对您来说已经足够了。我希望稍后会有更能干的人回答,但我想这个答案总比没有好。但是OpenMP循环中的错误没有得到很好的处理,您是否在Python外部使用OpenMP检查了C函数?

是的,在Python外部使用OpenMP的C函数工作正常。忘记添加了,C函数会使用指向Python中分配的数组的指针。只是想知道这是否可能是seg-fault的原因之一。你忘了添加一个标签,请仔细阅读该页。在没有特定代码的情况下推测错误是没有用的。对不起,代码太长,无法在这里发布。我提出了一些疑问,我认为这可能是我看到的seg故障的原因。