Сравнительный обзор современных компьютерных
реализаций интервальных арифметик.
Бондарь А.А.
Институт вычислительных технологий СО РАН, г. Новосибирск

Содержание:
1. Краткий обзор функциональности интервальных библиотек
1.1 Вступление.

Для решения задач с ограниченными неопределённостями и неоднозначностями в данных в последние десятилетия всё более широко применяются методы интервального анализа, математической дисциплины, возникшей около полувеканазад из необходимости учёта погрешностей расчётов на цифровых ЭВМ.

В последние годы интервальный анализ «перерос» задачи, которые вызвали его появление на свет, и успешно применяется не только для корректной обработки ошибок вычислений на ЭВМ с конечной разрядной сеткой, но и для решения задач с неточными входными данными (заданными в некоторых диапазонах), а также для решения ряда трудных традиционных математических задач, которые плохо поддаются другим методам.

Характерной чертой методов интервального анализа является рассмотрение отрезков вещественной прямой --- интервалов --- как целостных объектов, что естественно вызывает необходимость их оформления в виде отдельного типа данных со своими специфическими арифметическими и теоретико-множественными операциями, отношениями и т.п. Один из популярных путей воплощения в жизнь этой идеи --- создание на основе существующих языков программирования высокого уровня библиотек, реализующих интервальный тип данных и операции с ним. Такие библиотеки получили в последнее время большое распространение в качестве базового средства для реализации интервальных алгоритмов на ЭВМ.

В работе представлен сравнительный обзор двух наиболее популярных интервальных библиотек:

Автор приводит обзор возможностей и сравнение библиотек, делая основной упор на сравнении их производительности, которая измерялась временем исполнения тестового пакета из 10 специально подобранных программ. Тестирование осуществлялось в ОС семейства Linux, с компиляторами семейства GNU GCC, Intel C/C++/Fortran, на 4 различных компьютерных платформах: IA32 (Intel Prescott), IPF (Intel Itanium 2), EM64T (Intel Nocona), AMD64 (AMD Opteron).

В рамках данной работы предлагается сравнение производительности ИА указанных выше библиотек; введем обозначения для ИА соответствующих библиотек: filib++, boost.org.

1.2 Тонкости функционирования ИА: Режимы округления

Интервалы на языке высокого уровня описываются специальным типом данных, в простейшем случае представляющем собой сложный тип данных (класс или запись) состоящую из 2 чисел базового типа, задающего границы интервала. В качестве базового типа, как правило, выступает вещественный тип одинарной или двойной точности, реже допускаются интегральные типы данных или типы, определенные пользователем. Выполнение операций {+, -, *, /} над интервальным типом реализовано согласно правилам ИА. Отдельным моментом программной реализации интервальных объектов является механизм округления, задействованный при вычислении интервальных арифметических операций.

Рассмотрим сложение двух интервалов: a=[a1,a2] и b=[b1,b2]. Результат сложения: с=[c1,c2]=[a1+b1,a2+b2]. Для того, чтобы результирующий интервал с включал в себя истинный (математический) результат сложения интервалов a,b необходимо, чтобы при вычислении с1=(a1+b1) ЭВМ производило округление в сторону –БЕСКОНЕЧНОСТИ, а при вычислении с2=(a2+b2) в сторону +БЕСКОНЕЧНОСТИ.

Необходимо сделать некоторое замечание относительно процедуры округления.

Процедуру округления можно производить аппаратно или программно. Программное реализация предполагает эмуляцию процесса округления средствами языка, что, как правило, есть более затратная по времени процедура, нежели аппаратное округления с помощью процессора. За аппаратное округление в рамках семейства Intel-P6 отвечает регистр MXCSR. MXCSR – это регистр состояния и управления, он используется для установки флагов обнаружения арифметических исключений, флагов режимов обработки арифметических исключений, режима округления, режима flush-to-zero и для просмотра флага состояния. Поле управления округлением (RC) регистра MXCSR (биты 13 и 14) управляет, как округляется результат инструкции с плавающей точкой. Поддерживается четыре режима округления: округление до ближайшего, до меньшего или равного, до большего или равного, и в сторону нуля. Режимом по умолчанию является «округление до ближайшего». Смена режима округления – это достаточно дорогостоящая операция, требующая перезаписи всего регистра MXCSR.

Итак, для выполнения операции сложения двух интервалов необходимо выполнить последовательность из 6 действий:

Схема 1

Действия 1,6 необходимы для того, чтобы выполнение интервальных операций не влияло на выполнение остальных арифметических операций в программе.

1.3 filib++

В библиотеке filib++ существует 7 режимов округления, из которых:

Режимы аппаратного округления native_switched

Данный режим округления используется по умолчанию. Для округления используются все 6 шагов Схемы 1

native_directed

Режим функционирует так же как «native_switched», за исключением того, что пропущены шаги 1,6 Схемы 1, за счет чего скорость выполнения интервальных арифметических операций, потенциально, должна быть выше. Но, из-за того, что пропущены шаги 1,6 Схемы 1, в данном режиме не происходит сохранения текущего режима округления, иными словами, выполнение арифметических действий над интервалами влияет на выполнение других численных операций в программе.

native_onesided_switched

В данном режиме пропущен шаг 4 Схемы 1, что, потенциально, позволяет увеличить скорость выполнения операций ИА. Округление в сторону +? осуществляется следующим образом: +БЕСКОНЕЧНОСТИ (a2+b2)=-[-БЕСКОНЕЧНОСТИ (-(a2+b2))].

native_onesided_global

Данный режим аналогичен предыдущему, за исключением того, что, дополнительно, пропущены шаги 1,6 Схемы 1. Данный режим, так же как и режим «native_directed» влияет на выполнение других численных операций в программе.

Режимы программного округления

Режимы «multiplicative», «pred_succ_rounding» используются в случае, когда архитектура не поддерживает аппаратное округление.

В рамках данного тестирования от filib++ native_onesided_global как наиболее быстрый среди других режимов библиотеки.

1.4 IA of boost.org

В библиотеке стоит выделить два основных режима:

Для точных вычислений интервалов над типами «float», «double» следует использовать режим «rounded_math». Интервальный тип задается классом «boost::numeric::interval». В рамках нашего тестирования данный режим был назван «boost.org Standard mode, double».

Для быстрой работы с «широкими» интервалами без слежения за округлением и точностью следует использовать «save_state_nothing>». В данном режиме пропущены Шаги 2,4 Схемы 1. Интервальный тип задается следующим образом: typedef rounded_arith_exact RND1; typedef change_rounding , save_state_nothing< RND1> >::type interval; В рамках нашего тестирования данный режим был назван «boost.org Fast mode, double».

2. Сравнение производительности
2.1 Вступление: описание методики тестирования, тестовой среды, тестового пакета

Итак, задачей автора было сравнить производительность ИА 2-х интервальных; производительность характеризовалась временем исполнения тестового пакета состоящего из 10 программ.

Тестирование проводилось в 4 различных тестовых средах:

Архитектура IA32 P4
ОС: семейства Linux
Конфигурация: 3.0GHz MEM 1.0G Cache 512K
Компиляторы: Glibc 2.3.3-98.28, GNU GCC 3.3.3, Intel C\C++ 8.1.033, Intel Fortran 8.1.029

Архитектура EM64T Nocona
ОС: семейства Linux
Конфигурация: 2x3.2GHz MEM 4G Cache 4x1M
Компиляторы: Glibc 2.3.2-95.30, GNU GCC 3.2.3, Intel C\C++ 9.0.025/32, Intel C\C++ 9.0.025/32e, Intel Fortran 9.0.025/32, Intel Fortran 9.0.025/32e

Архитектура IPF_Itanium2 (Bandera)
ОС: семейства Linux
Конфигурация: 4x1.5GHz MEM 4G
Компиляторы: Glibc 2.3.3-98.28, GNU GCC 3.3.3, Intel C\C++ 8.1.032, Intel Fortran 8.1.028

Архитектура AMD64 GST Dual Opteron Lu Server
ОС: семейства Linux
Конфигурация: 2x2.6 GHz MEM 8G Cache 2x1M
Компиляторы: Glibc 2.3.2-95.30, GNU GCC 3.2.3, Intel C\C++ 9.0.025/32, Intel C\C++ 9.0.025/32e, Intel Fortran 9.0.025/32, Intel Fortran 9.0.025/32e

Описание тестового пакета:

программа Test1: в цикле 2 000 000 раз производится вычисление выражения x+y
программа Test2: в цикле 2 000 000 раз производится вычисление выражения x-y
программа Test3: в цикле 2 000 000 раз производится вычисление выражения x*y
программа Test4: в цикле 2 000 000 раз производится вычисление выражения x/y
программа Test5: в цикле 2 000 000 раз производится вычисление выражения (x*(x+y)-(x*y-z)-x)/(z*y)
программа Test6: к матрице А размера 500*500 заполненной интервалами со случайными границами вычисляется алгоритм Гаусса приведения матрицы к треугольному виду
программа Test7: вычисляется алгоритм умножение двух матриц А (размера 300*400) и B (размера 400*500) заполненных интервалами со случайными границами
программа Test8: в цикле 4000 раз вычисляется алгоритм умножение двух матриц А (размера 20*35) и B (размера 35*15) заполненных интервалами со случайными границами
программа Test9: к матрице размера 500*500 заполненной точечными интервалами (аналогично вещественной матрицы Гильберта) применяется алгоритм нахождения обратной матрицы
программа Test10: к матрице размера 500*500 заполненной точечными интервалами, содержащими случайные числа применяется алгоритм нахождения обратной матрицы

В таблицах результатов тестов, время выполнения каждого теста для одного из режимов берется за базовое и время выполнения тестов на других режимов вычисляться относительно базового. Знаком «(+)» отмечен лучший результат по данному Тесту среди всех режимов. Стоит сразу отметить, что режим «boost.org Fast mode, double» не производит смену мод округления в процессе выполнения интервальных операций, находясь тем самым в «другой» весовой категории, чем все остальные режимы (теоретически, данный режим обеспечивает меньшую точность, чем все остальные режимы данного тестирования).

2.2. Результаты на IA32
Таблица 1
Test # filib++
Native one_sided global,
double,
Extended,gcc
filib++
Native one_sided global,
double,
Extended,icc
boost.org
Standard mode,
double,gcc –O3
boost.org
Standard mode,
double,icc –O3
boost.org
Fast mode,
double,gcc –O3
boost.org
Fast mode,
double, icc –O3
Test1 100% 104.98%100.13%100.83% 92.21%(+)119.67%
Test2 100% 120.71% 101.03%100.9% 90.38%(+) 95.77%
Test3 100% 116.89%99.68% 96.98% 90.23%(+) 99.62%
Test4 100% 98.98% 101.02%98.35% 90.41%(+) 90.16%
Test5 100% 89.87% 92.38% 92.99% 81.83%(+) 85.49%
Test6 100% 69.99% 200.24%197.70% 4.86%3.42%(+)
Test7 100% 25.61% 33.43% 26.32% 21.38% 20.2%(+)
Test8 100% 65.47% 69.78% 66.56% 57.86% 57.92%(+)
Test9** 100% 67.48% 196.33% 193.23% 9.56% 7.07%(+)
Test10** 100% 66.99% 193.27% 190.12% 10.4% 7.72%(+)
Average: 100% 82.98% 118.73% 116.4% 54.91% 58.70%

Выводы по результатам тестов на данной платформе: 2.3. Об особенностях архитектур EM64T/AMD64 и IPF

Процессоры на основе архитектур EM64T (старое название - IA-32e) и AMD64 (старое название - х86-64) представляют собой 32-разрядные процессоры с поддержкой 64-разрядного расширения (в компиляторах Intel называемый режим 32e). Они рассчитаны на поддержку как 32-разрядной адресации, так и 64-разрядной прямой адресации больших объемов оперативной памяти (в рамках 32-разрядной адресации максимально возможный объем оперативной памяти равен 4Гбайтам). Процессоры с данной архитектурой полностью поддерживают функционирование в режиме IA-32 и обладают возможность работать в режиме IA-32e. В рамках режима IA-32 процессор может работать в защищенном режиме (16 бит), в режиме реальной адресации (32 бита), режиме виртуальных 8086. Режим IA-32e может использоваться только в среде 64-разрядных ОС.

Аббревиатура IPF расшифровывается как Itanium Processor Family. Семейство процессоров Itanium представляет собой 64-рязрядные процессоры, поэтому, в рамках данного тестирования, компиляция и запуск тестов на IPF платформе будет только происходить в родном, 64-разрядном режиме.

2.4 Результаты на EM64T
Таблица 2
Test # boost.org
Standard mode,
double,gcc –O3, -m32
boost.org
Standard mode,
double,gcc –O3, -m64
boost.org
Fast mode,
double,gcc –O3, -m32
boost.org
Fast mode,
double, gcc –O3, -m64
Test1 100%76.32% 97.33% 75.67%(+)
Test2 100%79.13% 104.1% 78.74%(+)
Test3 100%75.28% 96.19% 74.75%(+)
Test4 100%78.83% 103.66% 78.60%(+)
Test5 100%78.36% 102.61% 76.14%(+)
Test6 100%7.3% 2.88% 1.92%(+)
Test7 100%133.29% 79.42% 62.02%
Test8 100%89.61% 98.54% 74.42%(+)
Test9** 100%7.67% 5.10% 3.73%
Test10** 100%8.16% 5.50% 4.29%
Average: 100%63.4% 69.53% 53.03%


Таблица 3
Test # boost.org
Standard mode,
double,icc –O3, -32
boost.org
Standard mode,
double,icc –O3, -32e
boost.org
Fast mode,
double,icc –O3, -32
boost.org
Fast mode,
double, icc –O3, -32e
Test1 112.27%86.85% 114.08% 86.8%
Test2 116.42%89.48% 118.45% 88.92%
Test3 123.27%85.20% 109.76% 85.95%
Test4 120.89%89.75% 115.26% 89.02%
Test5 114.78%90.49% 117.65% 87.11%
Test6 97.44%8.02% 1.95% 1.58%
Test7 91.02%152.9% 69.61% 54.56(+)
Test8 111.86%101.06% 108.85% 82.95%
Test9** 101.49%8.46% 5.07% 2.98%(+)
Test10** 100.7%8.95% 4.33% 3.42%(+)
Average: 109.01%72.12% 76.50% 58.33%

Выводы по результатам тестов на данной платформе: 2.5 Результаты на AMD64
Таблица 4
Test # boost.org
Standard mode,
double,gcc –O3, -m32
boost.org
Standard mode,
double,gcc –O3, -m64
boost.org
Fast mode,
double,gcc –O3, -m32
boost.org
Fast mode,
double, gcc –O3, -m64
Test1 100%75.96% 94.38% 75.44%
Test2 100%79.2% 98.84% 78.85%
Test3 100%81.85% 98.98% 77.70%
Test4 100%80.2%(+) 100.42% 81.05%
Test5 100%84.27% 100.6% 80.64%
Test6 100%222.88% 65.25% 103.39%
Test7 100%168.17% 84.35% 68.44%
Test8 100%90.91% 95.58% 75.01%
Test9** 100%176.03% 118.6% 73.11%
Test10** 100%129% 70.08% 58.72%
Average: 100%118.85% 92.71% 77.24%


Таблица 5
Test # boost.org
Standard mode,
double,icc –O3, -32
boost.org
Standard mode,
double,icc –O3, -32e
boost.org
Fast mode,
double,icc –O3, -32
boost.org
Fast mode,
double, icc –O3, -32e
Test1 95.75%77.07% 93.01% 75.18%(+)
Test2 99.52%79.81% 97.61% 78.72%(+)
Test3 99.66%80.49% 97.62% 77.63%(+)
Test4 102.19%82.89% 101.63% 82.89%
Test5 101.28%83.85% 100.78% 80.14%
Test6 91.95%226.69% 51.69%(+) 48.73%
Test7 91.51%168.44% 55.84% 49.20%(+)
Test8 97.91%96.42% 93% 74.27%(+)
Test9** 99.82%251.05% 80.31% 65.54%
Test10** 79%137.38% 111.82% 51.12%(+)
Average: 95.86%128.41% 88.33% 68.34%


Выводы по результатам тестов на данной платформе:

На сегодняшний день, процессорные 64-разрядные процессорные решения набирают все большую популярность. Интервальные вычисления весьма критичны к архитектуре процессора, в том плане, что качественное повышения скорости выполнения интервальных вычислений откроет новые горизонты применения интервального подхода. Скорость интервальных вычислений, в частности, зависит от оптимальности интервальных алгоритмов по отношении к существующим реализациям интервальных библиотек, функционированию современных компиляторов (насколько компиляторы способны сформировать «хороший» машинный код для специфичных интервальных программных конструкций) и от того насколько процессор может взять на себя выполнение примитивных интервальных операций (к примеру, векторизация интервальных вычислений, способность с наименьшими затратами переключать моды округлений).

В этом плане, интересно сравнение производительности интервальных библиотек на родственных решениях от Intel и AMD: на процессорах EM64T Nocona и AMD64 Opteron. Сравнение, которое будет приведено ниже, не претендует на полноту и объективность и является лишь почвой для размышлений. Сравнение будет производится по результатам тестов «boost.org Standard mode». Из Таблиц 6,7 видно, что производительность режима “boost.org Standard mode, double” лучше на AMD64 Opteron чем на EM64T, на обоих режимах, 32 и 32е.

Таблица 6
Test # boost.org
Standard mode,
double,icc –O3, 32, EM64T
boost.org
Standard mode,
double,icc –O3, 32, Opteron
Test1 100%71.23%(+)
Test2 100%70.48%(+)
Test3 100%63.77%(+)
Test4 100%67.30%(+)
Test5 100%69.85%(+)
Test6 100%3.08%(+)
Test7 100%104.70%
Test8 100%71.54%(+)
Test9** 100%4.44%(+)
Test10** 100%4.98%(+)
Average: 100%53.14%

Таблица 7
Test # boost.org
Standard mode,
double,icc –O3, 32, EM64T
boost.org
Standard mode,
double,icc –O3, 32, Opteron
Test1 100%74.07%(+)
Test2 100%73.31%(+)
Test3 100%74.14%(+)
Test4 100%73.76%(+)
Test5 100%73.65%(+)
Test6 100%92.40%(+)
Test7 100%(+)114.62%
Test8 100%78.23%(+)
Test9** 100%(+)136.95%
Test10** 100%98.67%(+)
Average: 100%88.98%


2.6 Результаты на IPF
Таблица 8
Test # filib++
Native one_sided global,
double,
Extended,gcc
filib++
Native one_sided global,
double,
Extended,icc
boost.org
Standard mode,
double,gcc –O3
boost.org
Standard mode,
double,icc –O3
boost.org
Fast mode,
double,gcc –O3
boost.org
Fast mode,
double, icc –O3
Test1 100%96.34% 96.76% 96.76% 97.02% 90.57%(+)
Test2 100%96.52% 97.73% 96.89% 97.76% 90.77%(+)
Test3 100%94.91% 95.39% 95.09% 96.02% 88.70%(+)
Test4 100%96.28% 96.58% 96.43% 96.65% 90.33%(+)
Test5 100%90.18% 91.60% 92.10% 88.91% 83.91%(+)
Test6 100%18.49% 47.81% 39.20% 12.33% 9.05%(+)
Test7 100%26.46% 45.89% 39.06% 15.07% 9.16%(+)
Test8 100%65.44% 73.36% 71.88% 60.8% 54.81%(+)
Test9** 100%20.00% 43.35% 36.49% 26.58% 15.97%(+)
Test10** 100%19.97% 43.07% 35.60% 26.61% 16.22%(+)
Average: 100%64.74% 73.15% 69.95% 61.78% 54.95%


Выводы по результатам тестов на данной платформе: