Raul
30.11.2017 20:27
ВЕРСИЯ ПРЕДНАЗНАЧЕНА ДЛЯ ОЗНАКОМЛЕНИЯ И ТЕСТИРОВАНИЯ
При использовании в вычислительных целях рекомендуется отключить
макро _CBIGNUM_HARDWARE_MUL для всех трансляторов, кроме
64-разрядного Microsoft Visual C++. См. также важное замечание к
макро _CBIGNUM_SMALL_DIV и _CBIGNUM_SMALL_POWMOD к версии 2.1b.
- Готовится в качестве будущей высокопроизводительной стабильной
версии на замену 2.0 public.
- Операции над машинными числами перенесены в файл Cbnl.h.
- Использование типа long long для CBNL, если компилятор совместим
co стандартом С++11.
- Быстрое аппаратное умножение под 32-разрядным Microsoft Visual C++
без применения дополнительного ассемблерного пакета, ускорение
примерно в 10 раз.
- Использование аппаратного умножения вместо двоичного метода
под любым транслятором С++ (двоичный метод доступен при отмене
макро _CBIGNUM_HARDWARE_MUL).
- Поддержка 64/32 и 128/64-разрядного аппаратного деления в
дополнительном ассемблерном пакете под Visual C++ и GNU C++.
- Все тестовые 64-битные программы под Windows и Linux компилируются
с установленным макро _CBIGNUM_HARDWARE_DIV, которое разрешает
использование аппаратного деления.
- Программы Arifexp и Miller выдают информацию о разрядности и
методах, применяемых для ускорения вычислений.
- Обновлена оценка времени умножения в программе Arifexp.
- Документирована опция -mhz в программе Arifexp.
- Результаты тестирования производительности для 32-разрядного
С++ кода с аппаратным умножением.
- Тест производительности для Core i7-6800K и Phenom II X6.
10.11.2017 ВЫШЛА ВЕРСИЯ 2.1b BETA PUBLIC
ВАЖНОЕ ЗАМЕЧАНИЕ:
При отключенных макро _CBIGNUM_SMALL_DIV и _CBIGNUM_SMALL_POWMOD
данная версия класса использует алгоритмы, протестированные в
версии 2.0 public. Новые алгоритмы деления задействуются только
при включенных макро (по умолчанию). Эти алгоритмы в настоящее
время проходят публичное бета-тестирование и пока не рекомендуются
для проведения достоверных вычислений.
- Оптимизация алгоритмов деления на 32/64/128-разрядный (однословный
или двухсловный) делитель для сокращения число условных переходов.
Достигается примерно 2-кратный рост производительности по сравнению
с исходными реализациями в версиях 2.1a и 2.1b internal.
- Оптимизация 32/64/128-разрядного (однословного или двухсловного)
модуля неограниченного числа для сокращения число условных переходов.
Достигается примерно 2-кратный рост производительности по сравнению
с исходными реализациями в версиях 2.1a и 2.1b, а также на 60-80%
ускоряется возведение в степень по двухсловному модулю.
- Оптимизация алгоритма степени по однословному модулю для
сокращения числа условных переходов при трансляции под Microsoft
Visual C++ 2010 (дает 2-3 кратный рост производительности, ранее
этот эффект достигался только под Visual C++ 2015).
- Небольшая оптимизация аппаратного деления с модулем, старый
метод доступен при установленном макро _CBIGNUM_REVERSE_MOD.
- Оптимизация вывода неограниченного числа (около 10% или более
процентов производительности для относительно небольших чисел).
- Оптимизация методов деления и модуля с таблицей сдвигов для
снижения накладных расходов.
- ИЗМЕНЕНИЕ: Методы fit(), tab(), smp(), gc() и pack() теперь
недоступны для константных чисел из-за возможных проблем
с многопоточностью. Установите макро _CBIGNUM_CONSTCAST
в файле Cbignum.h, если надо использовать эти методы
как прежде.
- Новые методы divtab() и modtab(), дополнительная документация
по методам setdivtab(), setmodtab() и setdivmodtab().
- Из файлов Cbignum.cpp и Cbignumf.inl удален квалификатор
register с целью соответствия стандарту C++11.
- Проверена совместимость с Microsoft Visual C++ 2017.
- Все программы для Windows теперь компилируются под Microsoft
Visual C++ 2015 Community ради поддержки встроенных функций
с переносом/займом. Программы, скомпилированные под Visual C++
2012 и ниже работают заметно медленнее при операциях с
двухсловным делителем/модулем.
- Тестовые программы Miller64 и Miller64x для Windows скомпилированы
с установленным макро _CBIGNUM_HARDWARE_DIV.
- Построены новые исполняемые файлы для Linux с улучшенным кодом
32/64-разрядного аппаратного умножения и ускоренными операциями
с малым делителем/модулем.
- ИСПРАВЛЕНО: Prime.cpp не включает аппаратное деление для
факторизации однословных чисел при компиляции
в 64-разрядном режиме под Microsoft Visual C++.
- ИСПРАВЛЕНО: Предупреждение компилятора в Prime.cpp, связанное
с файлом Ctty.h.
- ИСПРАВЛЕНО: Тестовые программы Arifexp64x, Matrix64x и
Miller64x для процессоров с BMI2 не запускаются
под 64-разрядной Windows XP.
- ИСПРАВЛЕНО: Завышенная оценка времени деления в программе
Arifexp для больших делителей размером до
~16,000,000 бит.
- ИСПРАВЛЕНО: Генератор случайных чисел может работать неправильно
при компиляции в более чем 64-разрядном режиме
(неактуально для современных компиляторов).
27.07.2017 ВЫШЛА ВЕРСИЯ 2.1b BETA INTERNAL
ВЕРСИЯ ПРЕДНАЗНАЧЕНА ДЛЯ ОЗНАКОМЛЕНИЯ И ТЕСТИРОВАНИЯ
При использовании версии данной для вычислительных целей следует отключить
макро _CBIGNUM_SMALL_DIV и (возможно) _CBIGNUM_SMALL_POWMOD.
- Оптимизированный алгоритм деления неограниченного числа на
64/128-разрядный двухсловный делитель, ускорение в 2-3 раза.
- Ускоренное в 10 раз возведение в степень по 64/128-разрядному модулю.
- Использования инструкции LZCNT вместо BSR при трансляции для AVX2
в программах Arifexp64x, Matrix64x, Miller64x.
- Проверка деления/модуля на малый делитель альтернативным алгоритмом
с таблицей сдвигов в программе Arifexp.exe.
- ИСПРАВЛЕНО: Методы toCBNL(), tolong(), toint() and toshort() не работают
для ненормализованных чисел.
- ИСПРАВЛЕНО: Сдвиг на ненормализованное число не работает.
- ИСПРАВЛЕНО: Некорректная отладочная проверка индексов при возведении
в степень ненормализованного числа.
- ИСПРАВЛЕНО: Ошибка распределения памяти при возведении в
ненормализованную степень.
- ИСПРАВЛЕНО: Возможно некорректная работа очитка чисел в методах
clear(), gc() и pack() (ошибка в версии 2.1а бета).
27.06.2017 ОБНОВЛЕНИЕ ВЕРСИИ 2.1a BETA INTERNAL
ВЕРСИЯ ПРЕДНАЗНАЧЕНА ДЛЯ ОЗНАКОМЛЕНИЯ И ТЕСТИРОВАНИЯ
- Использование встроенных функций компилятора в 32-разрядном Visual C++.
- Макро _CBIGNUM_SMALL_DIV и _CBIGNUM_SMALL_POWMOD для включения тестовых
алгоритмов для короткого делителя/модуля, реализованных в 2.1 и
последующих версиях класса.
ПРИМЕЧАНИЯ: При выключенном макро _CBIGNUM_SMALL_DIV данную тестовую
версию класса можно использовать для вычислительных целей.
При выключенных _CBIGNUM_SMALL_DIV и _CBIGNUM_SMALL_POWMOD
данная версия использует только алгоритмы версии 2.0 public.
- ИСПРАВЛЕНО: Неправильный результат деления CBNL_MIN/CNBL_MIN.
09.06.2017 ВЫШЛА ВЕРСИЯ 2.1 BETA INTERNAL
ВЕРСИЯ ПРЕДНАЗНАЧЕНА ТОЛЬКО ДЛЯ ОЗНАКОМЛЕНИЯ И ТЕСТИРОВАНИЯ
- Упрощенный и оптимизированный алгоритм деления неограниченного числа
на 32/64-разрядный делитель с возможностью использования аппаратного
деления, если установлено макро _CBIGNUM_HARDWARE_DIV. Этот алгоритм
заменяет алгоритмы, ранее разработанные для версий 1.2c и 2.1.
- Новый алгоритм деления ускоряет тест "строго вероятной простоты"
Миллера в 2 раза для однословных чисел и на 20% для двухсловных чисел.
- Обновленный тестовый файл Millrand для больших чисел.
28.12.2016 ВЫШЛА ВЕРСИЯ 2.1 BETA INTERNAL (теперь BETA PUBLIC)
- Использование встроенных (intrinsic) функций Microsoft Visual C++
в качестве опции для 64-разрядного кода на стандартном С.
- Быстрое аппаратное умножение под 64-разрядным Microsoft Visual C++
без применения дополнительного ассемблерного пакета, ускорение
примерно в 10 раз.
- Оптимизированное деление 2-3 словного числа на 32/64-разрядный
делитель.
- Оптимизированный 32/64-разрядный модуль неограниченного числа
с возможностью использования аппаратного деления, если установлено
макро _CBIGNUM_HARDWARE_DIV.
- Ускоренное в 10 раз возведение в степень по 32/64-разрядному модулю.
- Опция _CBIGNUM_REDUCE_JUMPS игнорируется, поскольку оптимизация
компилятора работает эффективнее.
- Возобновлено бета-тестирование для нового кода.
- ИСПРАВЛЕНО: Опечатка в тесте деления файла Arifrand.
Для написания ответа авторизуйтесь