2008-11-24 7 views
2

tous! Taper à partir de l'Italie Ce petit morceau de code fonctionne si la taille de la matrice est inférieure à 800 et échoue avec un défaut de segmentation pour les tailles plus élevées .... Je l'ai essayé avec le compilateur gcc 4.3.2 dans Linux et MacOSX et le compilateur VisualStudio les fenêtres. Semble-t-il que le problème est dans la taille de la pile ..... comment puis-je l'augmenter? Comment puis-je résoudre le problème pour des tailles de matrice plus grandes? Le code fonctionne correctement en cas d'échec de la mise en série en parallèle. Merci.erreur de segmentation en utilisant 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; 

}} 

} 

Répondre

2

La taille de la pile par défaut dans OpenMP est de 4 à 8 Mo. Il y a une variable d'environnement appelée STACKSIZE que vous pouvez changer (par exemple 16384, soit 16 Mo). Voir le chapitre 5-5 de this PDF.

+0

Le lien est rompu. Il serait également bon de savoir s'il existe un moyen de modifier le comportement d'OpenMP à l'intérieur du programme, sans se soucier des variables environnementales. – darklon

+0

FYI: au moins sur certains systèmes, la version gcc d'OpenMP semble utiliser 2 Mo comme taille de pile par défaut pour tous les threads qu'elle lance. –

2

Avez-vous vraiment besoin d'allouer la matrice sur la pile?

Vous pouvez utiliser le tas à la place. Pour de grandes quantités de mémoire, il peut même être plus efficace (l'implémentation de l'allocateur peut utiliser des éléments tels que mmap anonyme qui permettent à la mémoire d'être relâchée sur le système d'exploitation lorsque vous la libérez).

+0

+1. @CesarB a raison, les objets de cette taille appartiennent au tas. –

0

vous pouvez ajuster la taille de la pile à travers la coque avec

'ulimit -s newstacksize'

- essayez 1000000

+1

Malheureusement, l'ulimit n'affecte généralement que le thread principal, pas les threads créés par OpenMP. –

0

threads OpenMP sont créés avec une taille de pile défini par la variable d'environnement OMP_STACKSIZE (ce qui est la norme de OpenMP 3.0 activé). Si la variable d'environnement n'est pas présente, la taille de la pile par défaut est spécifique à l'implémentation. Vous devriez plutôt utiliser le tas pour de telles allocations, mais il peut y avoir des raisons légitimes de vouloir changer la taille de la pile des threads OpenMP.

Questions connexes