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

老实说,我在uint2cuda 方面没有很多经验,这就是为什么我问我应该怎么做才能纠正这个问题。

4

2 回答 2

2

异或运算符适用于 unsigned long long,但不适用于 uint2(对于 CUDA 来说,它是一个包含两个无符号整数的内置结构)。

为了使代码工作,有几个选项。我想到的一些:

  • 您可以在执行异或的行中的每个 uint2 之前使用 reinterpret-cast<unsigned long long &> (请参阅如何在 C++ 中使用 reinterpret_cast?

  • 您现在可以在使用 uint2 的任何地方重写代码以使用 unsigned long long 类型。这可能会产生最可维护的代码。

  • 您可以使用 uint2 的 .x 和 .y 成员将异或行重写为一对异或行,因为每个都是无符号整数类型。

  • 您可以定义一个联合类型以允许访问当前类型为 uint2 的数据,如 uint2 或 unsigned long long。

  • 您可以重载 ^ 异或运算符以使用 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 回答
1

uint2只是一个结构,您需要^使用a[].xand来实现a[].y。我找不到内置声明的位置,但使用 CUDA 向量类型有优势吗?对它们的用途有很好的描述。

于 2015-05-19T00:06:20.273 回答