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 :

Allocation memoire pour grande matrice : tableau de tableau ?


Sujet :

C++

  1. #1
    Membre régulier Avatar de lyxthe
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Points : 90
    Points
    90
    Par défaut Allocation memoire pour grande matrice : tableau de tableau ?
    Bonjour à tous, j'ai des questions concernant la façon dont c++ gère certaines allocation de mémoire.

    J'ai besoin de créer une matrice de petits entiers relativement grande (16000*16000) et d'en calculer les puissances selon un algèbre Max+(je remplace l'addition par min et la multiplication par l'addition).

    J'en suis pour l'instant à calculer la première matrice (puissance 1). Évidemment j'ai testé un short Tab[16000][16000] qui me donnait un stack overflow, du coup j'ai remplacé ça en inscrivant chaque case dans un fichier txt, mais les entrées sorties en mémoire sont réputés comme étant super lent.

    J'aimerais donc garder la matrice totale en mémoire vive, j'ai remplacé les inscriptions dans le fichier txt par un truc dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	short **Matr= new short*[16824];
    	for(i=0;i<16824;i++){
    		Matr[i]=new short[16824];
    	}
    mais j'ai l'impression que le programme ne va pas plus vite, loin de là.

    Les pointeurs pointent-ils bien vers la ram?

    Y a-t-il un autre moyen pour calculer la totalité de ma matrice plus rapidement?

    Y a-t-il un autre moyen que les threads pour utiliser la puissances de mes 4 procs en meme temps (pour l'instant un seul mouline pendant l'exécution) ?

    Merci

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    boost.arrays me parait être une bonne solution mais je vois pas plus rapide que des pointeurs...

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    Bonjour,

    Citation Envoyé par lyxthe Voir le message
    j'ai testé un short Tab[16000][16000] qui me donnait un stack overflow...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	short **Matr= new short*[16824];
    	for(i=0;i<16824;i++){
    		Matr[i]=new short[16824];
    	}
    ne placez tout simplement pas votre tableau dans la pile, mettez le dans le tas via un new short Tab[16000][16000] ou tout simplement dans une variable globale (éventuellement une variable de classe). Il y a à cela trois avantages, 1) vous n'aurez pas a 'fabriquer' celui-ci via la boucle précédente, 2) vous pourez l'utiliser en tant que tableau sans devoir faire vous même le calcul de l'accès à un élément, 3) les accès seront légèrement plus rapide avec une indirection en moins

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par bruno_pages Voir le message
    Bonjour,



    ne placez tout simplement pas votre tableau dans la pile, mettez le dans le tas via un new short Tab[16000][16000] ou tout simplement dans une variable globale (éventuellement une variable de classe). Il y a à cela trois avantages, 1) vous n'aurez pas a 'fabriquer' celui-ci via la boucle précédente, 2) vous pourez l'utiliser en tant que tableau sans devoir faire vous même le calcul de l'accès à un élément, 3) les accès seront légèrement plus rapide avec une indirection en moins
    Dans l'état actuel, le tableau est déjà dans le tas, seul le pointeur qui en donne l'accès est sur la pile. Sinon T** t=new T[X][Y] ne compilera pas, il faudrait préciser une dimension.

    Enfn, la bonne solution c'est blitz++, boost::ublas, ....

  5. #5
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Dans l'état actuel, le tableau est déjà dans le tas
    actuellement il y a des vecteurs alloués dans le tas, pas un tableau

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par bruno_pages Voir le message
    actuellement il y a des vecteurs alloués dans le tas, pas un tableau
    Peut que je suis mal reveillé mais je ne vois pas ce que tu veux dire. Dans le code du PO on a un tableau de tableau alloué dans le tas, point.

    PO >>J'ai oublié de te demander si ta ta matrice est creuse ?

  7. #7
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    un tableau à 1 dim est un vecteur, mais je n'ai pas été clair,il aurait fallut dire actuellement il y a des vecteurs alloués dans le tas, pas un tableau à deux dimentions

  8. #8
    Membre régulier Avatar de lyxthe
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Points : 90
    Points
    90
    Par défaut
    La première est peu danse, mais au fur est à mesure mon but est d'en calculer les puissance. A priori plus je vais avancé dans la série des puissances de la matrice plus elle sera danse. Du coup je suis pas certain que ce soit intéressant de la coder de façon particulière.

    Je vais me concentrer plus particulièrement sur des soucis de performance dans cette discution : http://www.developpez.net/forums/d96...ds-appropriee/

  9. #9
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    En général, pour les matrices on conseille plutôt d'allouer un seul tableau de n*m éléments plus qu'un tableau de n tableau de m éléments.

    Ensuite, on fait une interface d'accès avec l'opérateur ()(int abs, int ord), ce qui permet de structurer les éléments au sein de sa table sans se préoccupper de l'interface (chose impossible avec [][]).

    Ici, ton tableau fait 512Mo. Je pense que tu peux l'allouer en ram contigüe avec un bête new short[16000*16000], sur une machine moderne ça devrait passer si elle n'est pas trop chargée.

    Après, ce qui va être important, c'est l'agencement en mémoire de tes éléments, par rapport aux parcours que tu vas faire (en règle générale, il faut toujours minimiser la "distance" parcourue en mémoire lors de ton parcours).

Discussions similaires

  1. allocation mémoire pour tableau de string
    Par alaninho dans le forum C++
    Réponses: 2
    Dernier message: 09/03/2012, 14h44
  2. Réponses: 8
    Dernier message: 22/07/2011, 15h28
  3. Schéma d'allocation mémoire pour une matrice
    Par Thierry Chappuis dans le forum C
    Réponses: 6
    Dernier message: 01/05/2011, 13h21
  4. Liberation memoire pour un tableau 2 dimensions
    Par alex01pernot dans le forum Débuter
    Réponses: 5
    Dernier message: 20/04/2010, 19h05
  5. Allocation d'un grand tableau sans boucle
    Par hei lan dans le forum Débuter
    Réponses: 2
    Dernier message: 09/06/2008, 11h52

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