Проблема автоматической оптимизации произвольных программ как никогда актуальна в наши дни.
Решением этой проблемы является создание системы, способной автоматически преобразовывать исходные тексты программ для выполнения высокоуровневых оптимизаций, направленных на распараллеливание и оптимизацию работы кэш-памяти в приложении.
Одной из существующих систем такого типа является Оптимизирующая Распараллеливающая Система (OPS).
Затем возникает потребность в предоставлении легкого доступа к системе широкому кругу пользователей. Для удовлетворения этой потребности и был создан веб-сервис optimus.py.
- OPS
- Docker
- Django
- Celery
- PostgreSQL
- Uvicorn
- Nginx
- Bootstrap
- Bokeh
- ctags
- Catch2
- GNU Make
- GCC и Clang
- и другие
Для развертывания сервера прежде всего необходимо скачать дистрибутив приложения. Это можно сделать при помощи системы контроля версий git:
git clone https://github.com/COOLIRON2311/optimuspy --recursive
Параметр --recursive
необходим для автоматического скачивания модуля opsc-bin, содержащего динамические библиотеки и исполняемые файлы системы OPS, скомпилированные под Linux.
Если не требуется запускать проект в контейнере, то этот параметр можно не указывать.
После скачивания дистрибутива проекта необходимо внести некоторые изменения в его конфигурационные файлы. Во-первых, в корневой директории проекта необходимо создать файл c именем .env
и содержимым:
SECRET_KEY ='**************************************************'
DJANGO_SETTINGS_MODULE='optimuspy.settings'
POSTGRES_DB=optimuspy
POSTGRES_USER=optimuspy
POSTGRES_PASSWORD=************************
DATABASE_HOST=db
DATABASE_PORT=5432
EMAIL_HOST='smtp.mailgun.org'
EMAIL_PORT=587
EMAIL_HOST_USER='**************************************************.mailgun.org'
EMAIL_HOST_PASSWORD='**************************************************'
SOCIAL_AUTH_GITHUB_KEY='********************'
SOCIAL_AUTH_GITHUB_SECRET='****************************************'
SOCIAL_AUTH_GITLAB_KEY='***************************************************************'
SOCIAL_AUTH_GITLAB_SECRET='****************************************************************'
Значения полей, содержащих символ «*», необходимо заменить на полученные от провайдеров соответствующих сервисов.
Затем, если не планируется отладка сервиса, то необходимо внести следующие изменения в файл optimuspy/settings.py:
- Поменять значение переменной
DEBUG
сTrue
наFalse
. - В список
CSRF_TRUSTED_ORIGINS
добавить текущий используемый сервисом домен. Например:'http://optimuspy.ru'
. - При необходимости изменить пути включения заголовочных файлов стандартной библиотеки C. По умолчанию указаны следующие значения:
INCLUDES = ['-I=/usr/lib/gcc/x86_64-linux-gnu/11/include', '-I=/usr/local/include',
'-I=/usr/include/x86_64-linux-gnu',
'-I=/usr/include']
- Убедиться, что включены все необходимые компиляторы и проходы системы OPS.
COMPILERS = [
Compilers.GCC, Compilers.Clang
]
...
OPS_PASSES = [
Passes.NoOptPass, Passes.OMPPass, Passes.TilingPass
]
...
-
По умолчанию в базовый образ cooliron/optimuspy:base включены компиляторы GCC 11.3.0 и Clang 15.0.7:
-
Наконец необходимо собрать и запустить сервис следующей командой:
docker compose up --build -d
Если же планируется отладка сервиса вне контейнера, то необходимо раскомментировать следующую строку в файле settings.py:
INSTALLED_APPS = [
# 'daphne',
...
И запустить сервер командой python manage.py runserver
.
Проведем оптимизацию и тестирование простой программы для умножения матриц с одновременным подсчетом суммы элементов:
#define N 500
float matmul(const float *a, int m, int n, const float *b, int p, int q, float *r)
{
if (n != p)
return 0;
float s = 0;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < q; j++)
{
for (int k = 0; k < p; k++)
r[i * m + j] += a[i * m + k] * b[k * p + j];
s += r[i * m + j];
}
}
return s;
}
void optimus()
{
float a[N * N], b[N * N], c[N * N];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
// ...
}
}
volatile float r = matmul(a, N, N, b, N, N, c);
}
После авторизации в системе одним из доступных способов, пользователь попадает на домашнюю страницу со списком своих отправлений.
Создадим новое отправление, нажав на кнопку «Отправить».
Зададим следующие параметры:
После завершения процесса выполнения экспериментов, пользователь попадает на страницу с результатами их проведения.
Со сценариями использования сервиса при взаимодействии с интерфейсом прикладного программирования можно ознакомиться в модульных тестах проекта и в модуле automation.