intérêt de faire un stockage 1D plutôt que 2D?
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

intérêt de faire un stockage 1D plutôt que 2D?



  1. #1
    invite5420aad7

    Question intérêt de faire un stockage 1D plutôt que 2D?


    ------

    Bonjour,

    j'ai comparé les deux types de stockage pour une matrice pleine à savoir :
    -> on stocke la matrice dans un tableau
    -> on stocke la matrice dans un tableau de tableau
    La première forme de stockage semble être la meilleure au niveau temps d'exécution si j'effectue par exemple un produit matrice/vecteur.
    Néanmoins je n'ai pas très bien compris pourquoi. Si quelqu'un a une réponse qu'il n'hésite pas à me la faire partage merci.

    Cordialement.

    -----

  2. #2
    Paraboloide_Hyperbolique

    Re : intérêt de faire un stockage 1D plutôt que 2D?

    Simplement cela est dû au fait que si l'on stocke la mémoire dans un tableau simple, toutes les données se trouveront dans une zone de mémoire contigüe, ce qui n'est pas le cas du stockage dans un tableau de tableau*.

    Lorsque le processus fait appel à une donnée de cette mémoire, le système d'exploitation charge également dans le cache toute la mémoire qui lui contigüe.
    Dans le cas du stockage dans un tableau simple, il y a de fortes chances que pour le prochain appel de donnée par le processus, cette donnée se trouve déjà dans le cache; qui est plus rapide d'accès que la mémoire vive. Il ne faudra donc pas re-remplir le cache.

    Dans le cas du stockage dans tableau de tableau, ce n'est pas forcément le cas. Il faudra alors à nouveau charger des données de la mémoire vive dans le cache, ce qui prend du temps.

    *Quoique cela dépende du langage de programmation employé, du compilateur, des options de celui-ci, du système d'exploitation et du hardware.
    Dernière modification par JPL ; 20/08/2012 à 23h18. Motif: Correction du titre

  3. #3
    invited1c1a33e

    Re : intérêt de faire un stockage 1D plutôt que 2D?

    Bonsoir, un tableau 2D c'est un tableau 1D auquel on applique un modulo. L'intérêt du tableau 2D, à part la clarté, c'est de vérifier que les indices ne dépassent pas les dimensions. Ces contrôles expliquent aussi un certain ralentissement.

    Ce que dit Paraboloide Hyperbolique est également exact, les explications peuvent varier selon le langage utilisé

  4. #4
    invited1c1a33e

    Re : intérêt de faire un stockage 1D plutôt que 2D?

    Par exemple si l'on a:

    Code:
    int tab2D[10][10] ;
    
    int tab1D[100] ;
    tab2D[5][9] correspondra à tab1D[5*10+9] , ce qui explique aussi pourquoi une opération de copie est plus rapide en 1D, le programme ayant moins de calculs d'indices à faire.

    au passage tab1D[53] correspond à tab2[53 /10][53 % 10] = tab2D[5][3] d'où le modulo dont je parlais.

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : intérêt de faire un stockage 1D plutôt que 2D?

    le programme ayant moins de calculs d'indices à faire.
    Je ne comprends pas trop la logique. Si on veut utiliser une matrice stockée dans un tableau 1D, il faudra bien faire le calcul à un moment ou à un autre pour trouver le rand de la donnée à partir de la ligne et de la colonne.
    Je trouve qu'il doit être surement plus efficace de laisser le compilateur faire le travail avec un tableau 2D.

    A+

  7. #6
    invited1c1a33e

    Re : intérêt de faire un stockage 1D plutôt que 2D?

    Citation Envoyé par Jack Voir le message
    Je ne comprends pas trop la logique. Si on veut utiliser une matrice stockée dans un tableau 1D, il faudra bien faire le calcul à un moment ou à un autre pour trouver le rand de la donnée à partir de la ligne et de la colonne.
    Je trouve qu'il doit être surement plus efficace de laisser le compilateur faire le travail avec un tableau 2D.

    A+
    Bonjour, je parlais d'une opération de copie de tableaux.

    Citation Envoyé par Zartan Voir le message
    une opération de copie est plus rapide en 1D, le programme ayant moins de calculs d'indices à faire.
    Si vous programmez par exemple le déplacement de deux cavaliers et d'un roi voulant capturer le roi adverse dans un jeu d'échecs, un échiquier 8x8 donc, vous pouvez déterminer le mouvement de la pièce en fonction de la case de départ sans utiliser d'indices à deux dimensions. Par exemple un cavalier s'avancera de +6,+10, +15, +17 ou reculera de -6,-10, -15 ou -17 dans un tableau de 0 à 63.

    La ligne et la colonne vous serviront uniquement à afficher le déplacement et éventuellement entrer la position de départ. Tout ce que vous devrez contrôler c'est que l'indice ne descend pas en dessous de 0 et ne dépasse pas 63.

    Comme un tel programme utilisera un grand nombre de copie de tableaux pour ses minimax ce sera certainement plus efficace de le coder en 1D qu'en 2D.

    Par conséquent cela dépend également du programme que vous devez faire.

    Sinon je suis d'accord qu'un compilateur bien conçu fera probablement de meilleurs choix d'optimisation qu'un programmeur (par exemple en utilisant des décalages de bits pour calculer les indices), mais passer de 2D à 1D permet justement de privilégier les opérations de copie au détriment des accès aux indices, qui ne sont pas forcément nécessaires comme on vient de le voir. Le compilateur s'occupe de la tactique et le programmeur de la stratégie

  8. #7
    invited1c1a33e

    Re : intérêt de faire un stockage 1D plutôt que 2D?

    J'oubliai qu'il faut quand même vérifier la position du cavalier car certains mouvements sont impossibles, mais cela ne change pas le reste du raisonnement. D'ailleurs les mouvements sont en principe pré-calculés.

  9. #8
    Jack
    Modérateur

    Re : intérêt de faire un stockage 1D plutôt que 2D?

    concernant la copie de tableau, le C par exemple assure que toutes les données d'un tableau sont contiguës. Que ce soit un tableau à 1, 3 ou n dimensions, il suffit de connaitre le nombre total de données pour effectuer la copie en une seule opération.

    A+

  10. #9
    invited1c1a33e

    Re : intérêt de faire un stockage 1D plutôt que 2D?

    En effet, ça dépend du langage utilisé.

  11. #10
    Paraboloide_Hyperbolique

    Re : intérêt de faire un stockage 1D plutôt que 2D?

    En fait, si mes souvenirs sont bons, le C garanti la contiguité d'un tableau de dimension n si celui-ci est statique:

    Par exemple:
    Code:
    int tab[10][20];
    Par contre, s'il est alloué dynamiquement cela n'est plus forcément le cas (quoique cela dépende d'autres facteurs comme le compilateur, le système d'exploitation...)

    Code:
    int **tab;
    *tab = malloc(10*sizeof(int*));
    
    for(int i = 0; i < 10; i++)
       {
       tab[i] = malloc(10*sizeof(int));
       }
    Dernière modification par Paraboloide_Hyperbolique ; 21/08/2012 à 12h34.

  12. #11
    Jack
    Modérateur

    Re : intérêt de faire un stockage 1D plutôt que 2D?

    En fait, si mes souvenirs sont bons, le C garanti la contiguité d'un tableau de dimension n si celui-ci est statique:
    Oui.

    Par contre, s'il est alloué dynamiquement cela n'est plus forcément le cas (quoique cela dépende d'autres facteurs comme le compilateur, le système d'exploitation...)
    Dans ce cas rien ne garantit la contiguïté des données du tableau. Mais là, ça devient compliqué car il existe plusieurs possibilités pour le stockage dynamique d'un tableau multidimensionnel.

    A+

  13. #12
    invite5420aad7

    Re : intérêt de faire un stockage 1D plutôt que 2D?

    merci beaucoup pour les explications.

Discussions similaires

  1. Intérêt de faire appel à un bureau d'étude thermique ?
    Par inviteb35b9c89 dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 3
    Dernier message: 05/02/2013, 14h07
  2. Réponses: 6
    Dernier message: 14/10/2009, 21h14
  3. Sujet plutôt original ou plutôt bâteau ?
    Par Seirios dans le forum TPE / TIPE et autres travaux
    Réponses: 8
    Dernier message: 16/09/2007, 11h22
  4. L'atome, plutot vide ? Plutot rempli d'életron et de nucléon ?
    Par invite1dc8ab32 dans le forum Physique
    Réponses: 15
    Dernier message: 08/08/2007, 16h43