c++ - 获得两个无符号整数乘积的高 32 位的有效方法 C++

标签 c++ compiler-optimization

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/

相关文章:

c++ - 为什么标准类型不提供来自分配器不同的源的转换构造函数/赋值

c++ - 使用计数选择运行中值算法 (C++)

c++ - 如何进行反向转换

c# - 由于缓存委托(delegate),C#编译器的行为异常

c++ - 为什么编译器不合并冗余的 std::atomic 写入?

c++ - 清理 DirectX 应用程序时崩溃

c++ - 基本函数的典型执行时间

C++ 模板 : Inlined code and Compiler Optimzations

c++ - 这是否是一个错过的优化机会

c - 小型 C 代码优化(黑客): Useless in today?