当我使用OpenMP使for循环并行时,为什么我的程序正在接收SIGABRT?

时间:2011-11-11 13:49:07

标签: c++ osx-lion openmp xcode4.2 llvm-gcc

我正在编写一个用C ++解决麦克斯韦方程式的科学计划。数据并行中的任务,我想使用OpenMP使程序并行。但是当我使用OpenMP在一个函数中并行化一个for循环时。当我运行我的代码时,程序获得SIGABRT。我发现出了问题。请帮忙。

for循环如下:

#pragma omp parallel for

for (int i = 0; i < totalNoOfElementsInSecondMesh; i++) {

    FEMSecondMeshElement2D *secondMeshElement = (FEMSecondMeshElement2D *)mesh->secondMeshFEMElement(i);

    if (secondMeshElement->elementType == FEMDelectricElement) {

        if (solutionType == TE) 
            calculateEzFieldForDielectricElement(secondMeshElement, i, currentSecondMeshIndex, nextFirstMeshIndex);
        else
            calculateHzFieldForDielectricElement(secondMeshElement, i, currentSecondMeshIndex, nextFirstMeshIndex);

    } else if (secondMeshElement->elementType == FEMXPMLDielectricElement) {

        if (solutionType == TE) 
            calculateEzFieldForDielectricPMLElement((FEMPMLSecondMeshElement2D *)secondMeshElement, i, currentSecondMeshIndex, nextFirstMeshIndex);
        else
            calculateHzFieldForDielectricPMLElement((FEMPMLSecondMeshElement2D *)secondMeshElement, i, currentSecondMeshIndex, nextFirstMeshIndex);

    }

}

编译器是llvm-gcc,默认情况下附带Xcode 4.2。

请帮忙。

3 个答案:

答案 0 :(得分:1)

您可能在Lion上遇到编译器问题。看到这个链接:

https://plus.google.com/101546077160053841119/posts/9h35WKKqffL

您可以从该页面上的链接下载为Lion预编译的gcc 4.7,这似乎工作正常。

答案 1 :(得分:0)

您是否尝试使用调试和所有警告编译程序,即使用-g -Wall标志?

然后您可以使用调试器(即gdb)来调试它。

您可以启用core(5)转储(通过适当设置,setrlimit(2)或调用它的ulimit shell builtin RLIMIT_CORE)。获得core个文件后,gdb can be used进行事后分析。还有gcore(1)强制core转储。

答案 2 :(得分:0)

当访问FEMSecondMeshElement2D * secondMeshElement,currentSecondMeshIndex或nextFirstMeshIndex时,程序崩溃的最可能原因是内存损坏 取决于if子句中的其他函数对它们的作用。

我建议您仔细检查变量的访问权限,并事先将它们声明为私有/共享线程。 e.g。

FEMSecondMeshElement2D *secondMeshElement = NULL;

#pragma omp parallel for private(secondMeshElement)
...