Почему моя программа получает SIGABRT, когда я использую OpenMP для создания параллельного цикла for? - PullRequest
1 голос
/ 11 ноября 2011

Я пишу научную программу для решения уравнения Максвелла с 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 ]

1 голос
/ 09 марта 2012

Возможно, вы столкнулись с проблемой компиляции на Lion. Смотрите эту ссылку:

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

Вы можете скачать gcc 4.7, предварительно скомпилированный для Lion, по ссылке на этой странице, и это, кажется, работает нормально.

0 голосов
/ 11 ноября 2011

Наиболее вероятной причиной сбоя вашей программы является повреждение памяти при доступе к FEMSecondMeshElement2D * secondMeshElement, currentSecondMeshIndex или nextFirstMeshIndex в зависимости от того, что с ними делают другие функции в условии if.

Рекомендую тщательно проверить доступ к переменным и заранее объявить их как приватные / общие. например,

FEMSecondMeshElement2D *secondMeshElement = NULL;

#pragma omp parallel for private(secondMeshElement)
...
0 голосов
/ 11 ноября 2011

Вы пытались скомпилировать вашу программу с отладкой и всеми предупреждениями, то есть с -g -Wall flags?

Затем вы можете использовать отладчик (то есть, gdb) дляотладка.

Вы можете включить core (5) dumps (путем соответствующей установки с помощью setrlimit (2) или встроенной оболочки ulimit , который называет это, RLIMIT_CORE).Если у вас есть файл core, gdb можно использовать для посмертного анализа.И есть также gcore (1) для принудительного core сброса.

...