2015-02-25 2 views
3

Depuis 2 ans, je développe une librairie: cyme pour effectuer un calcul SIMD sur "conteneur convivial". Je suis capable d'atteindre la performance maximale du processeur. Typiquement récipient défini par l'utilisateur et à écrire un noyau sous la syntaxe suivante (exemple trivial):assemblage hybride scalaire/vectoriel sur l'architecture Power7

for(i...) 
W[i] = R[i]+R[i]+R[i]+R[i]+R[i]; 

R [i] + R [i] + ... effectuer les opérations à l'aide de registres SIMD. J'ai un contrôle précis de la génération de l'asm (en utilisant l'expression du template). Je suis pleinement satisfait, cependant j'explore l'architecture Power depuis quelques jours. Le processeur Power7 a 4 unités de virgule flottante et une unité vectorielle (de wikipedia je lis: "Le processeur POWER7 a une unité de séquence d'instructions capable d'envoyer jusqu'à six instructions par cycle à un ensemble de files d'attente").

Mon idée était de générer ASM combinant des instructions sérielles et vectorielles, donc je peux être capable d'utiliser les 5 unités simultanément. Je l'ai fait, et mon pb commence maintenant:

La première version ASM du code précédent, pur SIMD-Power est:

.L536: 
    lxvd2x 0,0,9 
    stxvd2x 0,1,31 
    lxvd2x 12,0,9 
    stxvd2x 12,1,30 
    xvadddp 0,0,12 
    lxvd2x 12,0,9 
    xvadddp 0,0,12 
    xvadddp 0,0,12 
    xvadddp 0,0,12 
    stxvd2x 0,0,9 
    addi 9,9,176 
    cmpld 7,28,9 
    bne 7,.L536 

La série hybride "agréable"/SIMD (la boucle fait moins itération) est:

.L547: 
    std 31,128(1) 
    std 31,136(1) 
    lfd 12,24(9) 
    stxvd2x 63,1,30 
    lfd 11,16(9) 
    fadd 10,12,12 
    fadd 9,11,11 
    fadd 10,10,12 
    fadd 9,9,11 
    fadd 10,10,12 
    fadd 9,9,11 
    lxvd2x 0,0,9 
    std 31,480(1) 
    std 31,488(1) 
    stfd 11,128(1) 
    stfd 12,136(1) 
    stxvd2x 63,1,29 
    stxvd2x 0,1,30 
    fadd 10,10,12 
    fadd 9,9,11 
    stfd 10,24(9) 
    stfd 9,16(9) 
    lxvd2x 10,0,9 
    stfd 11,480(1) 
    stfd 12,488(1) 
    stxvd2x 10,1,29 
    xvadddp 0,0,10 
    lxvd2x 12,0,9 
    xvadddp 0,0,12 
    xvadddp 0,0,12 
    xvadddp 0,0,12 
    stxvd2x 0,0,9 
    addi 9,9,352 
    cmpld 7,28,9 
    bne 7,.L547 

l'indice de référence (un fil, mais faut-il utiliser deux) du premier code est de 0,2 [s] alors que la version hybride est de 0,25 [s]. Mes connaissances sur l'architecture des processeurs sont trop limitées pour comprendre pourquoi la version hybride est plus lente. Générer un langage d'assemblage en mélangeant les instructions vectorielles et en série était une idée charmante, donc si quelqu'un a une suggestion, est-ce possible ou non?

Best,

++ t

ps1: une version Déroulez SIMD devrait être plus rapide, je sais et je l'ai fait, mais je me concentre maintenant sur cette version hybride.

ps2: gcc 4.9.1, Power7-IBM, 8205-E6C

Répondre

1

Je n'ai aucune expérience pratique avec ces derniers, mais selon this PDF, il semble que la série 7 a fusionné le scalaire précédemment séparé et vecteur des unités à virgule flottante pour économiser de l'espace. Si cela est exact, l'entrelacement ne pourra réaliser aucune sorte de parallélisation au-delà des instructions vectorisées.

De l'abstrait:

Contrairement à des conceptions précédentes PowerPC, le Power7 FPU se confond le FPU scalaire et vecteur dans une seule unité d'exécution de trois virgule flottante instruction définit

Avez-vous accéder à un POWER6 pour tester votre code entrelacé? Je serais intéressé de voir comment ça se passe.

+0

Power6 non mais Power8 dans quelques jours ... merci pour le papier. –