Расширенная точность FP дает больше битов за такт (поскольку double
пропускная способность FMA равна 2 / такт против 32x32 => 64-битных при 1 или 2 / такт на процессорах Intel); рассмотрите возможность использования тех же приемов, которые Prime95 использует с FMA для целочисленной математики. С осторожностью можно использовать оборудование FPU для работы с точными числами.
Для вашего фактического вопроса: поскольку вы хотите сделать то же самое для нескольких пикселей параллельно, возможно, вы захотите выполнить перенос между соответствующими элементами в отдельных векторах, поэтому один __m256i
содержит 64-битные фрагменты из 4 отдельных больших целых чисел, а не 4 фрагмента такое же целое число.
С этой стратегией давление регистров является проблемой для очень широких целых чисел. Возможно, вы можете с пользой перейти к отсутствию распространения переноса за 4-й или 6-й вектор фрагментов или что-то в этом роде, используя vpmovmskb
в результате сравнения для генерации переноса после каждого добавления. Беззнаковое добавление имеет выполнение a+b < a
(беззнаковое сравнение)
Но AVX2 имеет только целочисленные сравнения со знаком (больше чем), а не беззнаковые. А с переносом (a+b+c_in) == a
возможно с b = carry_in = 0 или с b = 0xFFF ... и carry_in = 1, поэтому создание переноса непросто.
Чтобы решить обе эти проблемы, рассмотрите возможность использования фрагментов с ручным переносом в 60-битный или 62-битный или что-то в этом роде, чтобы они гарантированно были подписаны положительно, и поэтому выполнение из добавления появляется в старших битах полного 64-битного кода. битовый элемент. (Где вы можете vpsrlq ymm, 62
извлечь его для добавления в вектор следующих более высоких фрагментов.)
Возможно, здесь будут работать даже 63-битные фрагменты, поэтому перенос отображается в самом верхнем бите, и vmovmskpd
может проверить, произвел ли какой-либо элемент перенос. В противном случае vptest
сможет сделать это с правильной маской.
Это удобный вариант мозгового штурма; У меня нет планов расширять его до подробного ответа. Если кто-то хочет написать реальный код на основе этого, опубликуйте свой собственный ответ, чтобы мы могли проголосовать за него (если это вообще окажется полезной идеей).
person
Peter Cordes
schedule
12.11.2019