如何从使用uint64到uint32_t重写一些C ++代码

时间:2018-07-21 09:30:26

标签: uint32

我有一个用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代码)的变体完全不同。

我试图弄清楚al0ah0在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******************

对不起,这是一个很长的问题,但是希望有一些乐于助人的人。克里斯,非常感谢

0 个答案:

没有答案