2015-12-17 65 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。整個內聯部分最終使一個願意爲此做點事情的人感到惱火。 –