7

テストの目的で、Icc インライン アセンブラを使用して Intel の Xeon Phi 用の短いアセンブリ スニペットを作成しています。マスクされたベクトル命令を使用したかったのですが、インライン アセンブラに渡すことができませんでした。

次のようなコードの場合:

vmovapd  -64(%%r14, %%r10), %%zmm0{%%k1} 

エラーメッセージが表示されます

/tmp/icpc5115IWas_.s: Assembler messages:
/tmp/icpc5115IWas_.s:563: Error: junk `%k1' after register

さまざまな組み合わせを試しましたが、うまくいきませんでした。コンパイラのバージョンは、Linux では intel64/13.1up03 で、GAS 構文を使用します。

編集: 上記のコードは、実際には非拡張アセンブラで動作します。したがって、この:

__asm__("vmovapd  -64(%r14, %r10), %zmm0{%k1} ")

動作しますが、以下は動作しません:

__asm__("vmovapd  -64(%[src], %%r10), %%zmm0{%%k1} "
    :
    : [src]"r"(src)
    :)

拡張モードで名前を登録する前に、二重の % を使用する必要があることと関係があると思います。しかし、いいえ、k の単一の % も機能しません。

4

2 に答える 2

6

Intel Developer zone http://software.intel.com/en-us/forums/topic/499145#comment-1776563で同じ質問をしましたが、答えは、Xeon Phi でマスク レジスタを使用するためです。拡張インライン アセンブラでは、マスク レジスタ修飾子を二重中括弧で囲む必要があります。

vmovapd     %%zmm30,         (%%r15,    %%r10){{%%k1}}
于 2014-01-13T11:32:13.803 に答える
0

命令のマスクされたバリアントを使用する必要があると思います: VMASKMOVPD

于 2014-01-10T14:28:33.023 に答える