【问题标题】:Jknzd in inline asm, error with compilation内联汇编中的 Jknzd,编译错误
【发布时间】:2014-07-15 10:31:14
【问题描述】:

我尝试在 C 代码中为 MIC(英特尔至强融核)制作内联汇编。我对 jknzd 指令有疑问。

这是我的代码片段:

   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,选项:-mmic -lrt -O3。 当我尝试编译时,我收到以下消息:

/tmp/icc1XDD1vas_.s:汇编器消息: /tmp/icc1XDD1vas_.s:237: 错误: 无效字符 '{' 开始操作数 1 {rz-sae}' /tmp/icc1XDD1vas_.s:250: Error: invalid char '{' beginning operand 1{rn-sae}' /tmp/icc1XDD1vas_.s:254: 错误: 无效字符 '{' 开始操作数 1 {rn-sae}' /tmp/icc1XDD1vas_.s:260: Error: invalid char '{' beginning operand 1{rn-sae}' /tmp/icc1XDD1vas_.s:263: 错误: 无效字符 '{' 开始操作数 1 {rn-sae}' /tmp/icc1XDD1vas_.s:264: Error: invalid char '{' beginning operand 1{rn-sae}' /tmp/icc1XDD1vas_.s:360: 错误: 无效字符 '{' 开始操作数 1 {rz-sae}' /tmp/icc1XDD1vas_.s:373: Error: invalid char '{' beginning operand 1{rn-sae}' /tmp/icc1XDD1vas_.s:375: 错误: 无效字符 '{' 开始操作数 1 {rn-sae}' /tmp/icc1XDD1vas_.s:378: Error: invalid char '{' beginning operand 1{rn-sae}' /tmp/icc1XDD1vas_.s:383: 错误: 无效字符 '{' 开始操作数 1 {rn-sae}' /tmp/icc1XDD1vas_.s:385: Error: invalid char '{' beginning operand 1{rn-sae}' /tmp/icc1XDD1vas_.s:398: 错误: 无效字符 '{' 开始操作数 1 {rz-sae}' /tmp/icc1XDD1vas_.s:402: Error: invalid char '{' beginning operand 1{rn-sae}' /tmp/icc1XDD1vas_.s:415: 错误: 无效字符 '{' 开始操作数 1 {rn-sae}' /tmp/icc1XDD1vas_.s:417: Error: invalid char '{' beginning operand 1{rn-sae}' /tmp/icc1XDD1vas_.s:421: 错误: 无效字符 '{' 开始操作数 1 {rn-sae}' /tmp/icc1XDD1vas_.s:422: Error: invalid char '{' beginning operand 1{rn-sae}'

如果有一个简单的跳转,比如“jmp 1b”就可以了。我做错了什么?

【问题讨论】:

  • 听起来好像有些乱码?看看输出中的实际内容可能会很有趣(即 /tmp/icc1XDD1vas_.s 第 250 行)。
  • 您希望制作一个 vgatherpf0dps 循环吗?您是否尝试过收集预取内在函数?

标签: c inline-assembly icc xeon-phi


【解决方案1】:

这可能不是您想要的,但您可以使用内在函数测试掩码寄存器中的非零值。

从英特尔 MIC 论坛上的 thread,您可以看到这样的解决方案:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2010-11-24
    • 2013-07-23
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多