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 :

instructions AVX ?


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Par défaut instructions AVX ?
    Bonjour,

    Je suis familier des instructions SIMD (SSE1/2/3/4), mais je ne trouve nul part comment tirer partie des instructions AVX ?

    -Y-a t-il des instructions spécifiques similaires aux instructions SIMD ? Ou est-ce uniquement une optimisation du compilateur (si oui, comment fait-il ?)
    Par exemple, en tirant partie d'AVX, comment additionne t-on 8 floats d'un coup concrètement ?

    -Est-ce qu'un binaire compilé avec support AVX peut aussi marcher sur un ordinateur qui ne possède pas ces instructions (j'ai cru lire quelque part que non, mais il doit bien y avoir moyen de faire un binaire universel ?)

    -Il m'a semblé lire que l'utilisation d'AVX relachait l'obligation d'utiliser de la mémoire alignée; est-ce totalement vrai (aucun alignement nécessaire), ou seulement partiellement (blocks devant au moins être aligné sur 16 bytes, comme avec le SIMD classique).

    Merci !

  2. #2
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,

    C'est exactement pareil que pour le SSE.
    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
     
    const float fa[8] = {...};
    const float fb[8] = {...};
    float result[8];
    // load aligné
    __m256 a = _mm256_load_ps(fa);
    __m256 b = _mm256_load_ps(fb);
     
    // ou non aligné
    __m256 a = _mm256_loadu_ps(fa);
    __m256 b = _mm256_loadu_ps(fb);
     
    a = _mm256_add_ps(a, b);
     
    // store aligné
    _mm256_store_ps(result, a);
     
    // ou non
    _mm256_storeu_ps(result, a);
    Le code généré n'est utilisable que sur un processeur gérant AVX (coté Intel Sandy Bridge mini, coté AMD Bulldozer mini).

    Pour faire un binaire universel tu auras très certainement des ifs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void foo() {
        // il te faudra la définir en demandant l'info au processeur en début d'exécution.
        if(AVX_SUPPORTED) {
            // ...
        }
        else {
            // ...
        }
    }
    Il n'y à pas d'obligation d'alignement (ni pour SSE, ni pour AVX), les instructions sur la mémoire alignée sont juste plus rapides.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Par défaut
    Merci pour cette explication très claire!

    -Est-ce que du SSE sur 2 blocs mémoire non aligné reste plus rapide que sans SSE?
    -Un moyen simple de detecter la disponibilité des instructions AVX?

  4. #4
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par divide Voir le message
    -Est-ce que du SSE sur 2 blocs mémoire non aligné reste plus rapide que sans SSE?
    En général travailler sur de la mémoire non alignée est 5 à 10 % plus lent.

    Seul un test te dira si c'est toujours rentable.

    Citation Envoyé par divide Voir le message
    -Un moyen simple de detecter la disponibilité des instructions AVX?
    Je sais pas, mais probablement, regarde du coté des libs mathématiques (ou physique) orientées hautes performance.

  5. #5
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    tu peux aussi jeter un oeil a Boost.SIMD

    http://nt2.metascale.fr/doc/html/boost_simd.html

    et comment on gere le multi extensiosn :

    http://nt2.metascale.fr/doc/html/tut...t_runtime.html

Discussions similaires

  1. Jeu d'instruction AVX
    Par Dranen dans le forum C++
    Réponses: 4
    Dernier message: 20/02/2015, 10h49
  2. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44
  3. Instruction pour créer un fichier text ???
    Par Soulsurfer dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h17
  4. [Crystal Report][VB6] instruction PrintReport
    Par yyyeeeaaahhh dans le forum SDK
    Réponses: 4
    Dernier message: 29/07/2002, 14h58
  5. [TASM] Problème concernant l'instruction LGDT
    Par Ninkosen dans le forum Assembleur
    Réponses: 3
    Dernier message: 15/07/2002, 19h09

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