• [^] # Re: Et les cartes graphiques ?

    Posté par . En réponse à la dépêche Kalray un processeur massivement parallèle très impressionnant : Qu’il est loin le temps de mon ZX81. Évalué à 6.

    Ça dépend pas mal du constructeur. Les cartes Nvidia sont « SIMT » (Single Instruction, Multiple Threads), divisés en blocs de (par exemple) 32 threads. Il y a pas mal de limites (avec des contournements à la con pour les éviter). Par exemple, si j'ai le code d'un thread qui dit :

    if (condition) {
     // code
    } else {
     // code
    }

    Tous les threads d'un warp (d'un bloc) vont devoir passer par le if et le else. Donc même si un seul thread doit traiter le else, tous les autres threads doivent l'attendre. Le contournement est de récrire le code de cette manière (approximativement):

    if (condition) {
     // code
    }
    if (!condition) {
     // code
    }

    Ainsi on procède successivement à l'appel de deux if et là, ça marche. Oui, c'est couillon, mais c'est comme ça (ou en tout cas ça l'était jusqu'à il y a 2 ans ...).

    Les GPU de Nvidia ont aussi des mécanismes qui favorisent les accès séquentiels à la mémoire (en gros, si les accès sont tous séquentiels en VRAM, alors la performance est maximale car en gros les données sont « cachées »; sinon, il faut effectuer une sorte d'opération de « gather/scatter », ce qui ralentit considérablement l'exécution des threads).

    Les GPU d'AMD/ATI sont légèrement différents. Il y a bien une séparation en blocs, mais cette fois on a plutôt affaire à des CPU « VLIW » (very long instruction word), chaque instruction longue pouvant traiter jusqu'à 4 « instructions courtes » (ou peut-être 5). Et là il s'agit plus d'un « vrai » mode SIMD.