ошибка сегментации с использованием OMP - PullRequest
2 голосов
/ 24 ноября 2008

все! Печатать из Италии Этот маленький кусочек кода работает, если размер матрицы меньше 800, и приводит к ошибке сегментации для больших размеров .... Я пробовал это с компилятором gcc 4.3.2 в Linux и Macosx и компилятором VisualStudio в Windows. Кажется, проблема в размере стека ..... как я могу увеличить его? Как я могу решить проблему для больших размеров матрицы? Код работает нормально в последовательных путах, при параллельном выполнении. Спасибо.

#include <omp.h>
#include <stdio.h>
#define Nu 4000
int main() {
float A[Nu][Nu],B[Nu][Nu],C[Nu][Nu];
int i,j;
#pragma omp parallel
printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
#pragma omp parallel for private(j,i) shared(A,B,C) schedule(static)
for(j=0;j<Nu;j++){
for(i=0;i<Nu;i++){
//printf("Hello from thread %d, i,j %d %d\n", omp_get_thread_num(),i,j );
A[i][j]=0;
B[i][j]=0;
C[i][j]=0;

}}

}

Ответы [ 4 ]

2 голосов
/ 24 ноября 2008

Вы действительно должны разместить матрицу в стеке?

Вместо этого вы можете использовать кучу. Для больших объемов памяти это может быть даже более эффективно (реализация распределителя может использовать такие вещи, как анонимный mmap, которые позволяют освободить память обратно в операционную систему при ее освобождении).

2 голосов
/ 24 ноября 2008

Размер стека по умолчанию в OpenMP составляет 4-8 МБ. Существует переменная окружения, называемая STACKSIZE, которую вы можете изменить (например, на 16384, что составляет 16 МБ). См. Главу 5-5 из этого PDF .

0 голосов
/ 14 февраля 2012

Потоки OpenMP создаются с размером стека, определяемым переменной среды OMP_STACKSIZE (это стандарт для OpenMP 3.0 и далее). Если переменная среды отсутствует, размер стека по умолчанию зависит от конкретной реализации. Возможно, вам лучше использовать кучу для таких больших выделений, но могут быть веские причины для изменения размера стека потоков OpenMP.

0 голосов
/ 31 декабря 2008

вы можете настроить размер стека через оболочку с помощью

'ulimit -s newstacksize'

- попробуйте 1000000

...