2015-12-17 4 views
4

J'essaye d'écrire du code assembleur en ligne avec des instructions KNC pour la plate-forme Xeon Phi, en utilisant le compilateur k1om-mpss-linux-gcc. Je veux utiliser un registre de masque dans mon code afin de vectoriser mon calcul. Ici, il est mon code:invalide 'asm': variantes de dialecte d'assemblage imbriqué

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/time.h> 
#include <assert.h> 
#include <stdint.h> 

void* aligned_malloc(size_t size, size_t alignment) { 

    uintptr_t r = (uintptr_t)malloc(size + --alignment + sizeof(uintptr_t)); 
    uintptr_t t = r + sizeof(uintptr_t); 
    uintptr_t o =(t + alignment) & ~(uintptr_t)alignment; 
    if (!r) return NULL; 
    ((uintptr_t*)o)[-1] = r; 
    return (void*)o; 
} 

int main(int argc, char* argv[]) 
{ 
    const int vectorSize = 16; 
    int * n_arr = (int *) aligned_malloc(16 * sizeof(int),64); 
    int * lenS_arr = (int *) aligned_malloc(16 * sizeof(int),64); 
    int * tt_i = (int *) aligned_malloc(16 * sizeof(int),64); 
    int * tt = (int *) aligned_malloc(16 * sizeof(int),64); 
    int n = 5; 
    int lenS = 16; 
    int i; 

    for(i=0; i< 16; i++){ 
     tt_i[i] = 1; 
     n_arr[i] = n; 
     lenS_arr[i] = lenS; 
    } 
    __asm__("vmovdqa32 %1,%%zmm0\n\t" 
      "vmovdqa32 %2,%%zmm1\n\t" 
      "vmovdqa32 %3,%%zmm2\n\t" 
      "vpaddd %%zmm0,%%zmm1,%%zmm0\n\t" 
      "vpcmpgtd %%zmm0,%%zmm2,%%k1\n\t" 
      "vpsubd %%zmm2,%%zmm0,%%zmm0 {{%%k1}}\n\t" 
      "vmovdqa32 %%zmm1,%0;" 
      : "=m" (tt[0]) : "m" (tt_i[0]), "m" (n_arr[0]), "m" (lenS_arr[0])); 
    for (i=0; i <16 ; i++) 
    { 
     printf("tt_i[%d] = %d --- tt[%d] = %d\n",i, tt_i[i], i, tt[i]); 
    } 

    return 0; 
} 

Et quand je compile le code, j'ai cette erreur:

error: invalid 'asm': nested assembly dialect alternatives 

qui est liée à la cette ligne d'assemblage:

"vpsubd %%zmm2,%%zmm0,%%zmm0 {{%%k1}}\n\t" 

Des commentaires sur cette erreur?

+0

n'oubliez pas de déclarer% zmm0,1 et 2 comme mis à mal. Et% k1 je suppose. –

Répondre

5

Essayez d'utiliser %{%%k1%} dans le fichier asm en ligne pour obtenir {%k1} dans la sortie asm réelle. { et }need to be escaped.


Une recherche google sur le message d'erreur: nested assembly dialect alternatives trouvé un mailing list post sur les alternatives de dialecte asm, y compris un exemple testcase.

{} dans GNU C inline asm a déjà une signification particulière: fournir des alternatives pour différents dialectes ASM. L'utilisation de {{%%k1}} ressemble à gcc comme des alternatives imbriquées, ce qui n'est pas valide.

Le test cas/exemple:

int main (void) { 
    int f = 0; 
    asm ("{movl $42, %%eax | mov eax, 42}" : :); 
    asm ("{movl $41, %0||mov %0, 43}" : "=r"(f)); 
    if (f != 42) 
    abort(); 

    return 0; 
} 
+1

Vous pouvez également consulter les documents de gcc pour (asm) [https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#AssemblerTemplate]. –

+0

@DavidWohlferd: bon, bon point, bien sûr c'est documenté. Merci :). Mise à jour de ma réponse avec une solution ainsi que l'identification du problème. –

+0

En fait, jusqu'à récemment, il * n'était pas * doc'ed. Toute cette section en ligne a finalement agacé quelqu'un qui était prêt à faire quelque chose à ce sujet. –