最近,我开始使用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没有太多经验,这就是为什么我要问我应该做什么来纠正这个问题。

最佳答案

uint2只是一个结构,您需要使用^a[].x实现a[].y。我找不到内置声明的位置,但是Are there advantages to using the CUDA vector types?对它们的使用有很好的描述。

10-08 04:05