0

最近、CUDA と Ethereum の使用を開始しましたが、cuda ファイルに移植しようとするとエラーが発生する関数のコード スニペットを少し見つけました。

コード スニペットは次のとおりです。

void keccak_f1600_round(uint2* a, uint r, uint out_size)
{

#if !__ENDIAN_LITTLE__
    for (uint i = 0; i != 25; ++i)
        a[i] = make_uint2(a[i].y, a[i].x);
#endif

uint2 b[25];
uint2 t;

// Theta
b[0] = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20];

#if !__ENDIAN_LITTLE__
    for (uint i = 0; i != 25; ++i)
        a[i] = make_uint2(a[i].y, a[i].x);
#endif

}

行に関するエラーb[0]は次のとおりです。

error: no operator "^=" matches these operands operand types are: uint2 ^= uint2

uint2正直なところ、私はcuda との経験があまりないので、この問題を修正するにはどうすればよいかを尋ねています。

4

2 に答える 2

2

排他的論理和演算子は unsigned long long では機能しますが、uint2 (CUDA の場合、2 つの符号なし int を含む組み込み構造体) では機能しません。

コードを機能させるには、いくつかのオプションがあります。私の頭に浮かぶいくつか:

  • 排他的論理和を実行する行の各 uint2 の前に reinterpret-cast<unsigned long long &> を使用できます ( C++ で reinterpret_cast を使用する方法を参照してください) 。

  • 現在 uint2 を使用しているすべての場所で unsigned long long 型を使用するようにコードを書き直すことができます。これにより、おそらく最も保守しやすいコードが生成されます。

  • それぞれが unsigned int 型であるため、uint2 の .x および .y メンバーを使用して、uint2 型間の排他的論理和の行を排他的論理和行のペアとして書き直すことができます。

  • 現在 uint2 型であるデータへのアクセスを許可する共用体型を、uint2 または unsigned long long として定義できます。

  • ^ 排他的 OR 演算子をオーバーロードして、uint2 型を操作できます。

  • エラーを生成する行を asm ステートメントに置き換えて、排他的論理和を実行する PTX コードを生成できます。http://docs.nvidia.com/cuda/inline-ptx-assembly/index.html#using-inline-ptx-assembly-in-cudaを参照してください

于 2015-05-19T18:37:05.307 に答える