1

我正在编写一个科学程序来用 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);

    }

}

编译器是 Xcode 4.2 默认附带的 llvm-gcc。

请帮忙。

4

3 回答 3

1

您可能在 Lion 上遇到了编译器问题。请参阅此链接:

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

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

于 2012-03-09T00:45:07.810 回答
0

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

然后您可以使用调试器(即gdb)对其进行调试。

您可以启用core(5)转储(通过适当地设置,使用setrlimit(2)或调用它的ulimitshell 内置RLIMIT_CORE)。一旦有了core文件,gdb就可以用于事后分析。还有gcore(1)可以强制core转储。

于 2011-11-11T13:52:00.887 回答
0

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

我建议仔细检查变量的访问,并事先正确声明它们是线程私有/共享的。例如

FEMSecondMeshElement2D *secondMeshElement = NULL;

#pragma omp parallel for private(secondMeshElement)
...
于 2011-11-11T15:13:36.307 回答