2015-07-01 9 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; 
} 

Я пытаюсь написать следующее, используя MULX intrinsics на AVX2 (точнее, BMI2). Но они не дают одинаковых результатов.Почему эти две функции высокого (64bx64b) дают разные результаты?

static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t *c){ 
    return _mulx_u64(a, b, &c); 
} 
+0

Можете ли вы предоставить простой тестовый пример и результат для каждой реализации? –

+0

Первая функция является частью очень длинного кода. Я просто заменил его на 2-ю функцию, ничего больше. Считаете ли вы, что они должны быть одинаковыми? –

+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 ...) помогает поймать простые ошибки как это.

 Смежные вопросы

  • Нет связанных вопросов^_^