2008-11-24 2 views
2

все! Ввод из Италии Этот небольшой фрагмент кода работает, если размер матрицы меньше 800 и не работает с ошибкой сегментации для более высоких размеров .... Я пробовал это с помощью gcc 4.3.2 компилятора в linux и macosx и компиляторе VisualStudio в окна. Проблема Seemsthe в размере стека ..... как я могу увеличить его? Как я могу решить проблему для больших размеров матрицы? Код работает нормально в последовательном переносе с ошибкой при параллельном выполнении. Спасибо.ошибка сегментации с использованием OMP

#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; 

}} 

} 

ответ

2

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

+0

Ссылка не работает. Было бы также полезно знать, есть ли способ изменить поведение OpenMP изнутри программы, не вникая в переменные среды. – darklon 2012-02-14 16:04:16

+0

FYI: по крайней мере, на некоторых системах, версия gcc версии OpenMP, по-видимому, использует 2 МБ в качестве размера стека по умолчанию для всех потоков, которые запускаются. – 2013-02-27 16:18:50

2

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

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

+0

+1. @CesarB прав, объекты такого размера принадлежат куче. – 2008-11-24 10:56:46

0

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

'ulimit -s newstacksize'

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

0

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

Смежные вопросы