使用Python的OpenMP调用C函数会导致末尾分割故障



我编写了一个python脚本,该脚本称为c功能,该脚本使用openMP并行化(使用ctypes-wrapper传递了从python到c功能的变量(。C功能正常产生所需的输出。但是我在Python代码结束时会得到一个细分故障。我怀疑这与OpenMP产生的线程有关,因为在禁用OpenMP时不会发生SEG故障。

在代码的Python侧(称为外部C函数(我有:

...
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-----
}

我有以下问题和相关的混乱:

  1. python在C函数内部由OpenMP产生的线程的操作中是否有任何控制?我之所以问这是因为C功能接收指针,以由Python分配在堆中。OpenMP线程可以并行在此数组上执行操作,而不会打扰其分配的位置?

  2. 在调用C函数之前,我需要在Python代码中执行任何操作,例如释放GIL以允许在C函数中播放OpenMP线程?如果是,那是如何做到的?

  3. 我是否必须在C功能中释放GIL(在OpenMP并行块之前(?

我有swig(http://swig.org(,python的C和C 包装器生成器,其他语言为我组织了GIL版本。生成的代码看起来并不琐碎,并且正在使用PEP311的新发布/获取技术。但是,PEP中解释的旧技术可能足以使您足够。我希望有些更有能力的人以后会回答,但是这个答案总比没有好。但是OpenMP循环中的错误没有优雅地处理,您是否使用python外部的OpenMP检查了C函数?

相关内容

  • 没有找到相关文章

最新更新