0

符号付き整数を使用して cuda PTX で 128 ビットの符号付き乗算を行うときに問題を発見したと思います。ここに私のサンプルコードがあります:

long long result_lo, result_hi;
asm(" mul.lo.s64 %0, 0, -1;     \n\t" // 0 * -1 = 0
    " mul.hi.s64 %1, 0, -1;     \n\t"
    : "=l"(result_lo), "=l"(result_hi));

これにより、結果が生成されresult_lo = 0x0, result_hi = 0x0ます。ただし、これは結果を生成します。これは、間違いがなく、明らかにゼロでない場合result_lo = 0x0, result_hi = 0xFFFFFFFFFFFFFFFFの実際の値です。2^127 - (2^126 - 1)

まず、私の理解が正しいことを確認したいのですが、これを回避する方法はありますか?

更新Debugmod からモードに変更するReleaseと、この問題が修正されますが、これは cuda のバグなのかどうかまだ疑問に思っていますか?

Update 2 このバグを NVIDIA に報告しました

x64 DebugVisual Studio 2013でCuda ツールキット 7.5 を使用しましsm_52compute_52

4

1 に答える 1

3

TL;DRmul.hi.s64これは、プラットフォーム固有の PTX 命令のエミュレーションにおけるバグのsm_5xようです。そのため、NVIDIA にバグ レポートを提出することをお勧めします。

一般に、NVIDIA GPU は 32 ビット アーキテクチャであるため、すべての 64 ビット整数命令にはエミュレーション シーケンスが必要です。sm_2xおよびsm_3xプラットフォームの 64 ビット整数乗算の特定のケースでは、これらはIMAD.U3232 ビット整数乗算加算命令であるマシン コード命令から構築されます。

Maxwell アーキテクチャ (つまりsm_5x) では、高スループットで幅の狭い整数乗加算命令XMADが導入されましたが、低スループットの従来の 32 ビット整数乗算IMULは明らかに保持されていました。sm_5xCUDA 7.5 ツールチェーンによって生成された逆アセンブルされたマシン コードを調べるとcuobjdump --dumpsassptxas最適化レベル-O0(デバッグ ビルドに使用される) では、64 ビット乗算がIMUL命令でエミュレートされ、最適化レベル-O1以上XMADでは使用されることが示されます。根本的に異なる 2 つのエミュレーション シーケンスが採用されている理由が思いつきません。

結局のところ、 forのベースのIMULエミュレーションは壊れていますが、ベースのエミュレーションは正常に動作します。したがって、考えられる回避策の 1 つは、コマンド ラインで指定して、少なくともforの最適化レベルを利用することです。リリース ビルドはデフォルトでを使用するため、リリース ビルドには修正アクションは必要ありません。mul.hi.s64sm_5xXMAD-O1ptxas-Xptxas -O1nvcc-Xptxas -O3

コード分​​析から、 のエミュレーションは のエミュレーションmul.hi.s64のラッパーとして実装されておりmul.hi.u64、この後者のエミュレーションは を含むすべてのプラットフォームで正常に動作するようですsm_5x。したがって、別の可能な回避策は、独自のラッパーを使用することmul.hi.u64です。この場合、インライン PTX を使用したコーディングは不要です。デバイス組み込み関数およびを介してmul.hi.s64およびmul.hi.u64にアクセスできるためです。以下のコードからわかるように、結果を符号なし乗算から符号付き乗算に変換するための調整はごく簡単です。__mul64hi()__umul64hi()

    long long int m1, m2, result;
#if 0 // broken on sm_5x at optimization level -O0
    asm(" mul.hi.s64 %0, %1, %2;     \n\t"
        : "=l"(result)
        : "l"(m1), "l"(m2));
#else
    result = __umul64hi (m1, m2);
    if (m1 < 0LL) result -= m2;
    if (m2 < 0LL) result -= m1;
#endif
于 2016-02-14T20:51:57.160 に答える