ошибка сегментации с использованием OMP

все! Набор текста из Италии. Этот небольшой фрагмент кода работает, если размер матрицы меньше 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;

}}

}

person Community    schedule 24.11.2008    source источник


Ответы (4)


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

person schnaader    schedule 24.11.2008
comment
Ссылка не работает. Также было бы неплохо узнать, есть ли способ изменить поведение OpenMP изнутри программы, не вмешиваясь в переменные окружения. - person darklon; 14.02.2012
comment
К вашему сведению: по крайней мере, в некоторых системах версия OpenMP для gcc использует 2 МБ в качестве размера стека по умолчанию для всех запускаемых потоков. - person Mr Fooz; 27.02.2013

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

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

person CesarB    schedule 24.11.2008
comment
+1. @CesarB прав, объекты такого размера принадлежат куче. - person Mitch Wheat; 24.11.2008

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

'ulimit -s newstacksize'

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

person eyberg    schedule 31.12.2008
comment
К сожалению, ulimit обычно влияет только на основной поток, а не на созданный OpenMP. - person Mr Fooz; 25.02.2013

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

person darklon    schedule 14.02.2012