2015-07-01 142 views
2
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); 
} 
+0

你能提供一個簡單的測試用例和每個實現的結果嗎? –

+0

第一個函數是很長代碼的一部分。我只是用第二個功能替換它,沒有別的。你認爲他們也應該一樣嗎? –

+0

我在第二個函數中看到了一個可能的錯誤(請參閱下面的答案) - 我只是試圖將一個簡單的測試用例放在一起,以查看是否可以複製該問題。 –

回答

3

它看起來像這樣的功能可能是錯誤的:

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 ...)警告編譯有助於趕上簡單的錯誤喜歡這個。

相關問題