2015-12-17 71 views
4

我试着写与至强融核平台KNC一些指令内联汇编代码,使用k1om-mpss-linux-gcc编译器。我想在我的代码中使用一个掩码寄存器来向量化我的计算。这是我的代码:无效“汇编”:嵌套的汇编

#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; 
} 

当我编译代码,我得到这个错误:

error: invalid 'asm': nested assembly dialect alternatives 

这是关系到这条流水线:

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

有关此错误的任何想法?

+0

不要忘记申报%zmm0,1,和2重挫。和%k1我猜。 –

回答

5

尝试在联汇编使用%{%%k1%}得到{%k1}到实际的ASM输出。 {}need to be escaped


上的错误消息A谷歌搜索:nested assembly dialect alternatives发现mailing list post约ASM方言替代品,包括一个例子的测试用例。

{}在GNU C内联汇编已经有特殊含义:提供不同的ASM方言的替代品。

使用{{%%k1}}看起来像gcc的嵌套的替代品,这是无效的。

的测试用例/例子是:

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

你也可以看看gcc的文档的(ASM)[https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#AssemblerTemplate)。 –

+0

@DavidWohlferd:呃,好点,当然有记录。谢谢 :)。用解决方案更新我的答案,并找出问题所在。 –

+0

事实上,直到最近它*没有* doc'ed。整个内联部分最终使一个愿意为此做点事情的人感到恼火。 –