Nhiều CPU có mã hóa đơn lẻ để trả về các bit thứ tự của số nguyên 32 bit là cao. Thông thường nhân hai số nguyên 32 bit tạo ra một kết quả 64 bit, nhưng điều này được cắt ngắn xuống 32 bit thấp nếu bạn lưu trữ nó trong một số nguyên 32 bit.Tính toán hiệu quả các bit thứ tự cao của phép nhân
Ví dụ, trên PowerPC, mã mở mulhw trả về 32 bit cao của kết quả 64 bit của một bit 32x32 nhân trong một đồng hồ. Đây chính xác là những gì tôi đang tìm kiếm, nhưng đáng giá hơn. Có một opcode tương tự, umulhi(), trong NVidia CUDA.
Trong C/C++, có cách hiệu quả để trả lại các bit thứ tự cao của 32x32 nhân không? Hiện nay tôi tính toán nó bằng cách đúc đến 64 bit, một cái gì đó như:
unsigned int umulhi32(unsigned int x, unsigned int y)
{
unsigned long long xx=x;
xx*=y;
return (unsigned int)(xx>>32);
}
nhưng điều này là chậm hơn so với một thường xuyên 32 bởi 32 nhân hơn 11 lần vì tôi đang sử dụng quá mức cần thiết chút toán 64 ngay cả đối với các nhân.
Có cách nào nhanh hơn để tính toán các bit thứ tự cao không?
Điều này rõ ràng là không phải là được giải quyết tốt nhất với thư viện BigInteger (quá mức cần thiết và sẽ có phí rất lớn).
SSE dường như có PMULHUW, 16x16 -> phiên bản 16 bit hàng đầu này, nhưng không phải phiên bản 32x32 -> hàng đầu như tôi đang tìm kiếm.
Vâng, khá nhiều mọi trình biên dịch tôi đã làm việc sẽ làm điều này tại -O2, nếu không ở -O1. –