2014-07-15 5 views
0

MIC (Intel Xeon Phi) 용 C 코드에서 인라인 asm을 만들려고합니다. 그리고 jknzd라는 명령에 문제가 있습니다. Jknzd inline asm, 컴파일 오류

내 코드의 조각입니다 : -mmic -lrt -03 :

float *A = (float*)_mm_malloc(N * sizeof(float), 64); 
    int32_t* Indx = (int32_t*)_mm_malloc(N * sizeof(int32_t), 64); 

    __m512i idx = __cdecl _mm512_load_epi32(&Indx[i]); 
    asm (
      "kxnor %%k1, %%k1\n\t" 
      "1:" "vgatherpf0dps (%0, %1, 4){{%%k1}}\n\t" 
      "jknzd 1b, %%k1" 
      : 
      :"r"(A),"x"(idx) 
      :"%r8d", "%k1" 
    ); 

컴파일러는 ICC-13.0.1 옵션입니다.

/tmp/icc1XDD1vas_.s: Assembler messages: /tmp/icc1XDD1vas_.s:237: Error: invalid char '{' beginning operand 1 {rz-sae}' /tmp/icc1XDD1vas_.s:250: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:254: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:260: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:263: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:264: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:360: Error: invalid char '{' beginning operand 1 {rz-sae}' /tmp/icc1XDD1vas_.s:373: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:375: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:378: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:383: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:385: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:398: Error: invalid char '{' beginning operand 1 {rz-sae}' /tmp/icc1XDD1vas_.s:402: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:415: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:417: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:421: Error: invalid char '{' beginning operand 1 {rn-sae}' /tmp/icc1XDD1vas_.s:422: Error: invalid char '{' beginning operand 1 {rn-sae}'

"JMP의 1B"같은 간단한 점프가있는 경우는 괜찮습니다 : 내가 컴파일 할 때 , 나는이 메시지가 나타납니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

그 소리가 무엇인가 등이 왜곡지고? 출력에 실제로 무엇이 있는지는 흥미로울 것입니다 (즉, /tmp/icc1XDD1vas_.s 라인 250). –

+0

vgatherpf0dps 루프를 만들고 싶습니까? 프리 페치 집계 수집을 시도 했습니까? – amckinley

답변

0

이것은 사용자가 찾고자하는 것이 아니지만 내장 함수를 사용하여 마스크 레지스터에서 0이 아닌 값을 테스트 할 수 있습니다. 이 같은 솔루션 볼 수있는 인텔 MIC 포럼이 thread에서

:

if(!_mm512_kortestz(mask, mask)) // Returns true if at least one bit is 1 
{}