我有一个用c + +为cpu编写的挖掘程序,它是对流行的monero v7算法的改编。我试图在gpu上完成这项工作。问题在于monero gpu代码以不同的样式编写,因此我无法直接复制和粘贴所有代码。只是这最后一小段代码导致了我的问题。这是我要复制的来源。
CPU代码 https://gist.github.com/monkins1010/42eae4db87667b16a2aeee3677ee20cd
在上面的链接中引起我混乱的代码段62:
al0 += hi;
ah0 += lo;
uint64_t tmp_al0 = al0;
VARIANT1_2(al0, 0);
((uint64_t*)&l0[idx0 & MASK])[0] = al0;
((uint64_t*)&l0[idx0 & MASK])[1] = ah0;
al0 = tmp_al0;
ah0 ^= ch;
al0 ^= cl;
idx0 = al0;
VARIANT1_2(al0,0)执行此操作:
#define VARIANT1_2(p, part) \
if (VARIANT > 0) { \
const uint8_t tmp2 = ((uint8_t*)(&p))[1]; \
static const uint32_t table2 = 0x75310; \
const uint8_t index2 = (((tmp2 >> 3) & 6) | (tmp2 & 1)) << 1; \
((uint8_t*)(&p))[1] = tmp2 ^ ((table2 >> index2) & 0x33); \
上面的代码将数据重铸为其他类型并执行操作。这是新的代码,它是Variant1_1
的副本,在代码的前面几行使用了它,但是对另一个变量进行操作。该代码在GPU代码中不存在,因此我尝试将其拼接为:
我的GPU代码复制尝试 https://gist.github.com/monkins1010/ada8792804e5dd58191d9debc811a6ca
在上面第77行的这段代码中,(VARIANT> 0)部分== VARIANT1_1(&l0 [idx0&MASK]); (在CPU代码中)
if (VARIANT > 0)
{
const uint32_t table = 0x86420U;
const uint32_t index = ((z >> 26) & 12) | ((z >> 23) & 2);
const uint32_t fork_7 = z ^ ((table >> index) & 0x30U) << 24;
storeGlobal32(long_state + j, sub == 2 ? fork_7 : z);
}
else
storeGlobal32(long_state + j, z);
通过我的GPU尝试,上述代码是可以的,它是CPU代码中的第一个variant1_1
。
(CPU代码第63行中的第二个VARIANT1_2
和一些周围的代码是新代码,并且与(第101行附近的GPU代码)的变体完全不同。
我试图弄清楚al0
和ah0
在GPU代码中是什么,因此我可以在新的GPU代码中执行VARIANT1_2
,以进行自适应。 / p>
到目前为止,我的代码尝试是:
*((uint64_t *)t2) += sub2 ? (*((uint64_t *)t1) * *((uint64_t*)zz)) : __umul64hi(*((uint64_t *)t1), *((uint64_t*)zz));
res = *((uint64_t *)t2) >> (sub & 1 ? 32 : 0);
///*****************VARAINT 2nd attempt******************
if (VARIANT > 0) /// first attempt
{
uint32_t vl = res;
const uint8_t tmp2 = ((uint8_t*)(&vl))[1]; \
const uint32_t table2 = 0x75310U; \
const uint8_t index2 = (((tmp2 >> 3) & 6) | (tmp2 & 1)) << 1; \
((uint8_t*)(&vl))[1] = tmp2 ^ ((table2 >> index2) & 0x33U); \
storeGlobal32(long_state + j, sub == 3 ? vl : res);
}
else
storeGlobal32(long_state + j, res); //*addr = val;
///*****************VARAINT 2nd attempt - end******************
对不起,这是一个很长的问题,但是希望有一些乐于助人的人。克里斯,非常感谢