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
Power6 non mais Power8 dans quelques jours ... merci pour le papier. –