9

MSVC と ICC は両方とも、組み込み関数_addcarry_u64_addcarryx_u64.

Intel の Intrinsic Guideホワイト ペーパーによると、これらはそれぞれ と にマッピングする必要がadcxありadoxます。ただし、生成されたアセンブリを見ると、それらがそれぞれ および にマップされadcadcxにマップされる組み込み関数がないことが明らかadoxです。

/arch:AVX2さらに、MSVCで AVX2 を有効にするか-march=core-avx2、Linux の ICC でAVX2 を有効にするようにコンパイラに指示しても、違いはありません。 MSVC と ICC で ADX を有効にする方法がわかりません。

MSVCのドキュメントに_addcarryx_u64は ADX のテクノロジが記載_addcarry_u64されていますが、記載されているテクノロジはありません。ただし、これらの組み込み関数に関する MSVC のドキュメントのリンクは、MSVC 自身のドキュメントと生成されたアセンブリと矛盾する Intel Intrinsic ガイドに直接移動します。

このことから、Intel の Intrinsic ガイドとホワイト ペーパーは間違っていると結論付けます。

これは、インライン アセンブリが許可されていない MSVC の意味にある程度の意味がありadcます_addcarry_u64

adcxとの大きな利点の 1 つは、adox異なるフラグ (キャリーCFとオーバーフローOF) で動作することです。これにより、2 つの独立した並列キャリー チェーンが可能になります。しかし、これはadoxどのように可能でしょうか? ICC では少なくとも 1 つがインライン アセンブリを使用できますが、これは 64 ビット モードの MSVC では不可能です。


Microsoft と Intel のドキュメント (ホワイト ペーパーとオンラインの組み込みガイドの両方) は現在、一致しています。

_addcarry_u64固有のドキュメントには、のみを生成すると書かれていadcます。_addcarryx_u64組み込み関数は、またはのいずれadcxかを生成できますadox。ただし、MSVC 2013 および 2015 では_addcarryx_u64adcx. ICC は両方を生成します。

4

2 に答える 2

5

adcそれらは, adcxANDにマップされadoxます。コンパイラは、使用方法に基づいて、使用する命令を決定します。2 つの big-int 加算を並行して実行すると、コンパイラはスループットを高めるためにadcxandを使用します。adox例えば:

unsigned char c1 = 0, c2 = 0
for(i=0; i< 100; i++){ 
    c1 = _addcarry_u64(c1, res[i], a[i], &res[i]);
    c2 = _addcarry_u64(c2, res[i], b[i], &res[i]);
}
于 2015-03-24T18:04:46.900 に答える