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





Размер стека по умолчанию в OpenMP составляет 4-8 МБ. Существует переменная среды под названием STACKSIZE, которую вы можете изменить (например, на 16384, что составляет 16 МБ). См. Главу 5-5 этот PDF.
К вашему сведению: по крайней мере, в некоторых системах версия OpenMP gcc, похоже, использует 2 МБ в качестве размера стека по умолчанию для всех потоков, которые она запускает.
Вам действительно нужно размещать матрицу в стеке?
Вместо этого вы можете использовать кучу. Для больших объемов памяти это может быть даже более эффективным (реализация распределителя может использовать такие вещи, как анонимный mmap, который позволяет освободить память обратно в операционную систему, когда вы ее освобождаете).
+1. @CesarB прав, объекты такого размера принадлежат куче.
вы можете настроить размер стека через оболочку с помощью
'ulimit -s newstacksize'
- попробуй 1000000
К сожалению, ulimit обычно влияет только на основной поток, а не на созданные OpenMP.
Потоки OpenMP создаются с размером стека, определяемым переменной среды OMP_STACKSIZE (это стандарт, начиная с OpenMP 3.0). Если переменная среды отсутствует, размер стека по умолчанию зависит от реализации. Вероятно, вам лучше использовать кучу для таких больших распределений, но могут быть законные причины для желания изменить размер стека потоков OpenMP.
Ссылка не работает. Также было бы хорошо знать, есть ли способ изменить поведение OpenMP изнутри программы, не вмешиваясь в переменные окружения.