2

我正在尝试通过 CPU Crypto 扩展使用硬件加速的 SHA256 转换/“数据块排序”来使用 ARMv8/Aarch64 程序集实现。

问题是我不明白现有的 void sha256_transform(uint32_t *state, const uint32_t *block, int swap)(1)https://github.com/fireworm71/veriumMiner/blob/main/algo/sha2.c#LC81 和新的ARMv8 sha256函数 void sha256_block_data_order (uint32_t *ctx, const void *in, size_t num)(2)之间的区别https:/ /github.com/glukolog/m-cpuminer-v2.1-armv8/blob/master/miner.h#L135我试图与预处理器集成,条件是如果不是aarch64则保留原始代码 重定向工作到硬件加速sha256_block_data_order并且仅将原始文件sha256_transform作为包装函数保留,因此从其他函数对它的大量调用不需要太多(如果有的话)编辑。

我想提请注意原始 C 实现作为条件对块数据参数执行某些操作的参数,其中相同位置的int swap参数似乎与“块数”有关而不相关. 在我最近的尝试中,我在调用之前留下了“int swap”代码,以便按照最初的预期操作数据,并尝试在其函数调用中进行强制转换,认为这是这一切背后的罪魁祸首......下面是代码我最近写的里面用sha256_transformsha256_block_data_ordersha256_block_data_ordervoid sha256_transform(uint32_t *state, const uint32_t *block, int swap)

#if defined(__aarch64__)

    uint32_t W[64];
    uint32_t S[8];
    int i;

    // 1. Prepare message schedule W.
    if (swap) {
        for (i = 0; i < 16; i++)
            W[i] = swab32(block[i]);
        } else
        memcpy(W, block, 64);
        for (i = 16; i < 64; i += 2) {
            W[i]   = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
            W[i+1] = s1(W[i - 1]) + W[i - 6] + s0(W[i - 14]) + W[i - 15];
    }

sha256_block_data_order(state, (const unsigned char *) W, 1);

    for (i = 0; i < 8; i++)
        state[i] += S[i];
#else

对于最后一个循环,我猜测它在另一个应用程序中的等价物,其中 ARMv8至少sha256_block_data_order 在其C 实现中使用,但对汇编的理解不够好,无法查看那里是否正在执行相同的操作uint32_t S正在用于 C 实现中,sha256_transform但我无法判断它是否在上面代码的最终循环之前以任何方式被更改。

在链接 (2) 中有一个声明sha256_transform但是不适用,尽管您可以比较输入(两个单独的应用程序共享它的相同实现)sha256_block_data_order也在那里声明以查看差异。

在我进行这项工作的各种尝试中,我能够让它在没有错误的情况下编译并在基准测试模式下运行 cpuminer 二进制文件,但是当我让它为服务器做真正的工作时,所有结果都被拒绝。此外,我只发现性能上的个位数差异(以哈希率衡量)。这是否表明即使我可以让它正常工作,我也不会看到任何有价值的性能提升?

我在这上面花了几天时间,不是很有经验或技术,所以才来这里问。任何反馈或建议表示赞赏。

4

1 回答 1

2

我最终设法弄清楚了。如果有兴趣,请参阅 github fork repo。由于缩小的内联 sha256 函数,散列应用程序的速度提高了大约 1%。以及更好的 memcpy 和双问题优化。

https://github.com/rollmeister/veriumMiner

于 2018-08-30T01:26:40.517 回答