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 :

Comment obtenir le maximum de performance (calcul) ?


Sujet :

C++

  1. #41
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Alors (avec N=100 cette fois, j'avais mis à 64 par erreur plus haut)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Test original :
    3520.54 ms
    Test avec float* Q = new float[N*N*N+16]+16;
    1919.73 ms
    Test avec le dernier code de screetch (alloca)
    2018.73
    Le static de static void compute... ne semble pas avoir d'effet particulier.

    Donc au final, si je comprends bien, le problème venait du fait que le compilateur aligne en mémoire les deux adresses de P et Q (lors du new), ce qui fait qu'il ne peut plus y accéder simultanément après (mais alors pourquoi les aligner ?). Et dans le dernier code les calculs intermédiaires sont fait dans la pile (avec alloca) pour forcer le compilateur a comprendre qu'il n' y a pas d'aliasing, le tas et la pile étant bien distinct. C'est à peu près ça ?

  2. #42
    screetch
    Invité(e)
    Par défaut
    Mathieu, le principal est de faire un bout de calcul, le mettre dans un buffer, copier le buffer, recommencer
    je le fais sur une ligne, mais ca pourrait etre un nombre arbitraire, genre 128, qui ne coïncide pas avec les lignes

    Arzar, le probleme c,est qu'en informatique beaucoup de choses reposent sur des puissances de 2, et il y a des chances que l'allocateur alloue au meme endroit (enfin, aligné), meme si tu lui demandes 1500
    en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	float* P = new float[N*N*N*2];
    	float* Q = &P[N*N*N];
    si N n'est pas une puissance de 2, ca marche
    si N est une puissance de 2, kaboom, les perf meurent.

    Sur la pile, tu as moins de chance d'etre aligné mais tu peux quand meme l'etre (ca serait la faute a pas de bol...)
    l'idéal donc :

    - avoir un buffer sur la pile (peu importe la taille, mais un truc qui permet de travailler en batch)
    - désaligner de manière certaine le buffer et les paramètres d'entrée/sortie en sautant les premiers éléments (un ptit peu de math avec l'adresse des buffers...)
    - faire le calcul et stocker dans le buffer
    - lorsque le buffer est plein, on le copie dans le résultat

  3. #43
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Et en utilisant posix_memalign au lieu de new[] ?

  4. #44
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par screetch Voir le message
    Mathieu, le principal est de faire un bout de calcul, le mettre dans un buffer, copier le buffer, recommencer
    je le fais sur une ligne, mais ca pourrait etre un nombre arbitraire, genre 128, qui ne coïncide pas avec les lignes
    A voir, je note dans la liste des possibilités. Je vais déjà tester si le compilateur me permet d'avoir de bonnes perfs en mettant le stencil dans une sous-fonction et passer par structure.

    edit: bon, il faut donner explicitement le stencil dans la boucle, sinon ça ne fonctionne pas

Discussions similaires

  1. comment obtenir différents calcul dans état
    Par Domi70 dans le forum IHM
    Réponses: 10
    Dernier message: 16/02/2009, 00h06
  2. Comment obtenir la valeur d'un calcul ?
    Par EGSway dans le forum IHM
    Réponses: 4
    Dernier message: 21/06/2007, 19h14
  3. comment obtenir un polynome de regression
    Par evariste_galois dans le forum Mathématiques
    Réponses: 17
    Dernier message: 19/01/2007, 15h06
  4. Comment obtenir l'heure du serveur avec flash ?
    Par Michaël dans le forum Flash
    Réponses: 9
    Dernier message: 23/12/2003, 17h50
  5. Comment obtenir la liste des paramètres d'une SP ?
    Par Le Gritche dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/03/2003, 16h54

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