Apple的M1处理器和完整的128位整数产品

2021-03-18 08:30:05

如果我乘以两个64位整数(在[0,2 64)中的值),则产品需要128位。英特尔和AMD处理器(X64)可以使用单个指令(MUL)计算两个64位整数的完整(128位)乘积。 ARM处理器,例如在您的手机中找到的,需要两个指令来实现相同的结果:MUL计算最低有效的64位,而MULH计算最高的64位。

我认为它通常意味着计算完整的128位产品更昂贵,其他一切都相同,在臂处理器上比X64(英特尔)处理器相同。但是,指令集不必确定性能。例如,ARM处理器可以识别出我正在调用两个指令(MUL和MULH)并更有效地处理它们。

uint64_t splitmix(){ UINT64_T z =(状态+ = uint64_c(0x9e3779b97f4a7c15)); z =(z ^(z>> 30))* uint64_c(0xbf58476d1ce4e5b9); z =(z ^(z>> 27))* uint64_c(0x94d049bb133111eb); 返回z ^(z>> 31); }

uint64_t wyhash(){ state + = 0x60bee2bee120fc15 ull; __uint128_t tmp =(__uint128_t)(州)* 0xa3b195354a39b70dull; UINT64_T M1 =(TMP>> 64)^ TMP; tmp =(__uint128_t)m1 * 0x1b03738712fad5c9 ull; 返回(tmp>> 64)^ tmp; }

正如我之前报道的那样,Wyhash在英特尔或AMD处理器上几乎应该始终更快,因为它只有两个乘法,而SplitMix函数由两个具有其他几个操作的乘法。但是,Wyhash需要两个完全乘法,而SplitMix只需要两个64位产品。如果Wyhash中的两个完整乘法等同于两种四个乘法,那么Wyhash变得更加昂贵。

我写了一个小的C ++基准测试,以测量使用Apple的新M1处理器(ARM)计算随机值所需的时间(以纳秒为单位)。编译器是Apple Clang版本12,默认在新的Apple Silicon笔记本电脑上默认出现。

Wyhash发生器比Apple M1处理器上的SplitMix更快(大约50%),这表明Apple硅在计算两个64位整数的完整128位乘积时是有效的。