我正在尝试通过 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_transform
sha256_block_data_order
sha256_block_data_order
void 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 二进制文件,但是当我让它为服务器做真正的工作时,所有结果都被拒绝。此外,我只发现性能上的个位数差异(以哈希率衡量)。这是否表明即使我可以让它正常工作,我也不会看到任何有价值的性能提升?
我在这上面花了几天时间,不是很有经验或技术,所以才来这里问。任何反馈或建议表示赞赏。