【发布时间】:2009-09-08 23:54:36
【问题描述】:
许多 CPU 具有用于返回 32 位整数乘法的 高 位的单一汇编操作码。通常将两个 32 位整数相乘会产生 64 位结果,但如果将其存储在 32 位整数中,则会将其截断为低 32 位。
例如,在 PowerPC 上,mulhw 操作码在一个时钟内返回 32x32 位乘法的 64 位结果的高 32 位。这正是我正在寻找的,但更便携。 NVidia CUDA 中有一个类似的操作码 umulhi()。
在 C/C++ 中,有没有一种有效的方法来返回 32x32 乘法的高位? 目前我通过转换为 64 位来计算它,例如:
unsigned int umulhi32(unsigned int x, unsigned int y)
{
unsigned long long xx=x;
xx*=y;
return (unsigned int)(xx>>32);
}
但这比常规的 32 x 32 乘法要慢 11 倍以上,因为即使是乘法,我也使用过大的 64 位数学运算。
有没有更快的方法来计算高位?
这显然不是最好用 BigInteger 库来解决(这太过分了,而且会产生巨大的开销)。
SSE 似乎有 PMULHUW,这是一个 16x16 -> 前 16 位版本,但没有我正在寻找的 32x32 -> 前 32 位版本。
【问题讨论】:
标签: c++ c optimization