unsigned int a = 4294967295; // (2^32)-1
unsigned int b = 2;
我正在尝试找出获取两个无符号整数乘积的高 32 位的最有效方法。
例如,使用 CUDA 编程我可以unsigned int first32bits = __umulhi(a,b)
并获得高 32 位。
有没有办法在 C++ 中做这样的事情?
这是我的方法:
unsigned long c = ( ((unsigned long)a * (unsigned long)b ) >> 32) & 0x00000000FFFFFFFF;
有什么方法可以让我的方法更快吗?
最佳答案
除非有一些依赖于体系结构的电路将 imulh32
映射到本地指令,否则我认为这是您可以做的最好的事情。
查看由 g++ 6.3
为您的函数生成的程序集,很明显它只花费 1
汇编操作,而不是只做乘法的函数,因为shr $0x20
.
unsigned long umulhi32( unsigned int x, unsigned int y)
{
return ( ((unsigned long)a * (unsigned long)b ) >> 32);
}
0000000000000960 <_Z8umulhi32jy>:
960: 89 f8 mov %edi,%eax
962: 89 f7 mov %esi,%edi
964: 48 0f af c7 imul %rdi,%rax
968: 48 c1 e8 20 shr $0x20,%rax
96c: c3 retq
96d: 0f 1f 00 nopl (%rax)
组装 cuda umulhi
以查看它是否映射到一些专用的 PTX 指令会很有趣,我认为自从 PTX
cuda
使用的程序集公开了,例如,mul24
其中 ( quoting )
mul24.hi performs a 24x24-bit multiply and returns the high 32 bits of the 48-bit result
据我所知,x86汇编中没有这样的指令。
希望这对您有所帮助。
关于c++ - 获得两个无符号整数乘积的高 32 位的有效方法 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44449558/