IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Segmentation fault troublant


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut Segmentation fault troublant
    Bonjour à tous.

    Je viens de constater un problème assez curieux dont j'ignore complètement la provenance.
    Je fais des comparaisons de temps de calculs sur OpenMP en utilisant des nombres différents de threads.
    Voici mon petit programme de test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <stdio.h>
    #include <stdlib.h>
    // librairie openmp
    #include <omp.h>
     
    // Multithreading ?
    #define MULTITHREAD
    // Dimension des matrices
    #define N 3000
     
    // Définition des 3 matrices
    int A [N][N];
    int B [N][N];
    int C [N][N];
     
    int main()
    {
    	long i,j,k;
     
    	// Initialisation des 2 matrices sources
    	//srand(time(NULL));
    	for (i=0; i<N; i++) {
    		for (j=0; j<N; j++) {
    			A[i][j] = 1+rand()%9;
    			B[i][j] = 1+rand()%9;
    			C[i][j] = 0;
    		}
    	}
     
    	#ifdef MULTITHREAD
    	// OpenMP adapte automatiquement le nombre de threads en fonction des capcités de la machine
    	//omp_set_dynamic(1);
    	//printf("\nThreads dispos: %i",omp_get_max_threads());
    	// OpenMP utilise un nombre de threads définit par l'utilisateur
    	omp_set_dynamic(0);
    	omp_set_num_threads(3);
     
    	// Directive OpenMP pour exécuter du code en parallèle sur une boucle for
    	#pragma omp parallel for shared (A,B,C) private (i,j,k)
    	#endif
     
    	for(i=0;i<N;i++) {
    		for(j=0;j<N;j++) {
    			for(k=0;k<N;k++) {
    				C[i][j] += A[i][k]*B[k][j];
    			}
    		}
    	}
     
    	return 0;
    }
    Comme vous pouvez le constater c'est très simple... multiplication de matrice en multithreadé.
    Le programme fonctionne très bien, pas de soucis à ce niveau là.

    Par contre je me suis arraché les cheveux pendant quelques heures car j'avais une erreur à l'exécution quand mes matrices faisaient grosso modo plus de 1000 * 1000 en dimension:
    Segmentation fault (core dumped)

    La seule différence que j'avais par rapport à cette version là est que les 3 matrices A,B, et C étaient déclarées dans le main.
    Depuis que je les ait déclarées en global, plus aucun soucis, je peux passer sans soucis à de grandes dimensions et aucune erreur.

    Je fais tourner le programme sous Fedora.
    J'ai testé avec et sans OpenMP, même soucis si les matrices sont déclarées dans le main.

    Je serais bien curieux de savoir de quoi ça vient.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    De toute façon, un tableau de 3000 x 3000 c'est tout de même beaucoup.
    Il me semble que si un tableau est alloué en static (ce qui est le cas), il doit trouver un espace mémoire unique.
    Allouez vos tableaux dynamiquement, tout devrait s'arranger.

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Bonjour,
    De toute façon, un tableau de 3000 x 3000 c'est tout de même beaucoup.
    Il me semble que si un tableau est alloué en static (ce qui est le cas), il doit trouver un espace mémoire unique.
    Allouez vos tableaux dynamiquement, tout devrait s'arranger.
    C'est surtout la taille de la pile qui est limitée.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    J'ai aussi une version avec allocation dynamique... même soucis...
    Les variables qu'on crée dans une fonction sont stockées en totalité dans la pile et pas celles qui sont crée en global, ce serait ça ?

  5. #5
    la_tupac
    Invité(e)
    Par défaut
    J'ai pas tout suivis mais oui c'est le cas ... pour les variables instanciées dans une fonction.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    A mon avis, si c'était un problème de pile il y aurait le terme "stack" dans le message d'erreur, et non "segment".
    C'est probablement vos fonctions omp_set_... qui provoquent cet écrasement de mémoire.

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par Le_CuLtO Voir le message
    J'ai aussi une version avec allocation dynamique... même soucis...
    Les variables qu'on crée dans une fonction sont stockées en totalité dans la pile et pas celles qui sont crée en global, ce serait ça ?
    Les variables locales sont créées par allocation automatique sur la pile et l'espace mémoire maximum alloué à celle-ci est limité.
    Ce n'est pas le cas des variables en allocation statique (globales ou déclarées static) ou en allocation dynamique (créées par la famille malloc()) où on dispose de la mémoire disponible. Dans le cas de l'allocation dynamique, il faudra quand même qu'il existe des segments de mémoire compacts de 36Mo (si tes int font 4 octets) pour que l'allocation réussisse. Pour les grosses allocations dynamiques, tu peux avoir intérêt à les faire tôt dans le programme avant d'avoir un émiettement de la mémoire disponible.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Impeccable merci à tous pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo