为什么这两个高(64bx64b)函数会给出不同的结果?
问题描述:
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t* hip) {
__uint128_t product = ((__uint128_t)a)*((__uint128_t)b);
*hip = product>>64;
return (uint64_t)product;
}
我想在AVX2(更具体地说是BMI2)上面使用MULX intrinsics编写如下的代码。但他们没有给出相同的结果。为什么这两个高(64bx64b)函数会给出不同的结果?
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t *c){
return _mulx_u64(a, b, &c);
}
答
它看起来像这样的功能可能是错误的:
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t *c){
return _mulx_u64(a, b, &c);
}
这也许应该是:
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t *c){
return _mulx_u64(a, b, c);
} //^
注意,启用(如gcc -Wall ...
)警告编译有助于赶上简单的错误喜欢这个。
你能提供一个简单的测试用例和每个实现的结果吗? –
第一个函数是很长代码的一部分。我只是用第二个功能替换它,没有别的。你认为他们也应该一样吗? –
我在第二个函数中看到了一个可能的错误(请参阅下面的答案) - 我只是试图将一个简单的测试用例放在一起,以查看是否可以复制该问题。 –