256-битное арифметическое c в Clang (расширенные целые числа) - PullRequest
10 голосов
/ 03 августа 2020

Я нахожусь на этапе разработки проекта, который должен выполнять множество простых 256-битных целочисленных арифметических c (только add, sub, mul, div) и мне нужно что-то, что достаточно хорошо оптимизировано для этих четырех операций.

Я уже знаком с GMP, NTL и большинством других тяжеловесных реализаций bignum. Однако накладные расходы на эти реализации подталкивают меня к созданию моей собственной низкоуровневой реализации - чего я на самом деле не хочу; этот материал, как известно, сложно понять.

В своем исследовании я заметил новые расширенные целочисленные типы в Clang - я являюсь пользователем cc - и мне было интересно, есть ли у кого-нибудь опыт работы с расширенными целыми числами в реальная реализация в гневе? Оптимизированы ли они для «очевидных» размеров бит (256, 512, и т. Д. c)?

Я работаю в C на x-64 под linux (в настоящее время Ubuntu, хотя открыт для другие дистрибутивы при необходимости). Я в основном использую g cc для производственных работ.

Отредактировано для добавления: @phuclv идентифицировал предыдущий ответ C ++ 128/256-битные целые типы фиксированного размера . (Спасибо @phuclv.) Этот вопрос / ответ посвящен поддержке c ++; Я надеялся выяснить, есть ли у кого-нибудь особый c опыт работы с новыми типами Clang.

1 Ответ

5 голосов
/ 03 августа 2020

Похоже, что разделение с этими типами в настоящее время не поддерживается за пределами 128 бит.

По состоянию на 2 августа 2020 года с использованием clang trunk на Godbolt, компилируя следующий код для x86-64

typedef unsigned _ExtInt(256) uint256;

uint256 div(uint256 a, uint256 b) {
    return a/b;
}

выдает сообщение об ошибке

fatal error: error in backend: Unsupported library call operation!

Попробуйте

То же самое происходит с _ExtInt(129) и всем, что больше, чем я пытался. _ExtInt(128) и меньше, похоже, работают, хотя они вызывают внутреннюю библиотечную функцию __udivti3 вместо встраивания.

Об этом сообщалось как Ошибка LLVM 45649 . На этой странице есть некоторые обсуждения, но результат, похоже, заключается в том, что они действительно не хотят писать полную инструкцию деления произвольной точности.

Сложение, вычитание и умножение действительно работают с _ExtInt(256) в этой версии .

...