Skip to content
249 changes: 249 additions & 0 deletions src/opencl/Compare.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,249 @@
# Сравнение библиотек для создания механизма конфигурирования
Вся информация взята из репозиториев соответствующих проектов. Дата обращения: 21.04.26.

## Критерии сравнения
Comment thread
gsvgit marked this conversation as resolved.

| Критерий | Метрика | Единицы измерения |
|:---|:---|:---|
| **Зависимости** | наличие | +/- |
| **Источники** | CLI (argv) / env / файлы | +/-, форматы |
| **Стандарт C++** | минимальная версия | C++хх |
| **Поддерживает стандарт иерархии** | Linux/Windows/MacOS | +/- |
| **Способ распространения** | header-only / статическая / динамическая | — |
| **ОС** | Linux / Windows / macOS | +/-, компиляторы |
| **Активность** | среднее число коммитов | коммитов/мес (за последний мес) |
| **Issues** | open, closed/open | n, коэффициент |
| **Сообщество** | GitHub Stars | n |
| **Проходит ли CI** | CI | +/- |

> ? - не указано в README.


## Сравнение парсеров командной строки (CLI)

| Критерий | CLI11 | cxxopts |
|:---|:---:|:---:|
| Зависимости | - | - |
| **Источники** | | |
|  CLI (argv) | + | + |
|  env | + | - |
|  Файлы | - | - |
| Стандарт C++ | ≥ C++11 | ≥ C++11 |
| **Поддерживает стандарт иерархии** | | |
|  Linux | + | + |
|  Windows | + | + |
|  MacOS | + | + |
| Способ распространения | header-only | header-only
| **ОС** | | |
|  Linux | + (GCC 4.8+, Clang 3.5+) | + (GCC ≥ 4.9, Clang ≥ 3.1) |
|  Windows | + (MSVC ≥ 2015) | + (MSVC ≥ 2015) |
|  macOS | + (AppleClang 7+) | + (Clang ≥ 3.1 с libc++) |
| **Сообщество** | | |
|  Активность (коммитов/мес) | 4 | 1 |
|  Issues всего | 506 | 307 |
|  Issues closed/open | 9 | 6 |
|  Stars | 4.3k | 4.7k |
| Проходит ли CI | + | + | + |


## Парсеры файлов

| Критерий | nlohmann/json | yaml-cpp | toml++ | toml11 | config-cxx | taocpp/config
|:---|:---:|:---:|:---:|:---:|:---:|:---:|
| Зависимости | - | - | - | - | - | - |
| **Источники** |
|  CLI (argv) | - | - | - | - | - | - |
|  env | - | - | - | - | + | + |
|  Файлы | JSON | YAML | TOML | TOML | JSON, YAML, XML | JSON, JAXN |
| Стандарт C++ | ≥ C++11 | ≥ C++11 | ≥ C++17 | ≥ C++11 | ≥ C++20 | ≥ C++17 |
| **Поддерживает стандарт иерархии** |
|  Linux | + | + | + | + | + | + |
|  Windows | + | + | + | + | + | + |
|  MacOS | + | + | + | + | + | + |
| Способ распространения | header-only | статическая/динамическая¹ | header-only/статическая/динамическая¹ | header-only/статическая/динамическая¹ | header-only | header-only |
| **ОС** | | |
|  Linux | + (GCC 4.8–14.2, Clang 3.4–21.0) | + (GCC, Clang) | + (Clang 8+, GCC 8+) | + (GCC, Clang) | + (GCC 13+, Clang 16+) | +
|  Windows | + (MSVC 2015–2022) | + (MSVC) | + (MSVC VS2019+) | + (MSVC, MinGW) | + (MSVC 143+ (VS 2022)) | +
|  macOS | + (AppleClang 9.1–16.0) | + (Xcode, AppleClang) | + (AppleClang) | + (AppleClang) | + (AppleClang 16+) | +
| **Сообщество** | | |
|  Активность (коммитов/мес) | 2 | 9 | 2 | 4 | 2 | 13 |
|  Issues всего | 3271 | 905 | 193 | 194 | 24 | 5 |
|  Issues closed/open | 68 | 3 | 8 | 5 | 0 open | 0 open |
|  Stars | 49.4k | 15k | 2k | 1.3k | 31 | 194 |
| Проходит ли CI | + | + | + | - | + | ? |

> ¹ Опционально.

## Сравнение универсальных инструментов

| Критерий | Boost.Program_options
|:---|:---:|
| Зависимости | +¹ |
| **Источники** | | |
|  CLI (argv) | + | + |
|  env | + | + |
|  Файлы | INI |
| Стандарт C++ | ≥ C++3 |
| **Поддерживает стандарт иерархии** | | |
|  Linux | + |
|  Windows | + |
|  MacOS | + |
| Способ распространения | статическая/динамическая² |
| **ОС** | | |
|  Linux | + (GCC 5+, Clang 3.6+) |
|  Windows | + (MSVC 2015 (vc140)+) |
|  macOS | + (AppleClang) |
| **Сообщество** | | |
|  Активность (коммитов/мес) | 12 |
|  Issues всего | 400 |
|  Issues closed/open | 1 |
|  Stars | 9.4k |
| Проходит ли CI | + | + |

> ¹ Список зависимостей:
> 1. Boost.Any
> 2. Boost.Bind
> 3. Boost.Config
> 4. Boost.Core
> 5. Boost.Detail
> 6. Boost.Function
> 7. Boost.Iterator
> 8. Boost.Lexical Cast
> 9. Boost.Smart Ptr
> 10. Boost.ThrowException
> 11. Boost.Tokenizer
> 12. Boost.Type Traits

> ² Опционально.


## Итог:
По результатам сравнения, вероятно, лучшим вариантом будет использование `CLI11` и `nlohmann/json`, так как они, в отличие от `Boost.program_options`, не требуют зависимостей и являются header-only.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А что не так с config-cxx?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Меньше issues и как будто активность поменьше. Я помню, Вы говорнили, что это дискуссионная характеристика. Всетаки config-cxx взять?


# Сценарии использования spla:
**Что важно всем:** возможность выбрать платформу и устройство

1. Пользователь хочет решить свою задачу
- Неподготовленный пользователь
- важно:
- быстрая настройка через флаги
- что конфигурировать:
- уменьшить количество отладочной информации
- остальное - дефолтные параметры
- Опытный пользователь:
- важно:
- детальная ручная конфигурация параметров через конфигурационный файл
- ускорение вычислений с разреженными данными
- что конфигурировать:
- управление кэшем
- кастомные аллокаторы для разных форматов данных
- управление очередями команд
- Wave size override
- Work-group size
- оптимизация доступа к глобальной памяти
- управление логированием
2. Разработчик spla
- Отладчик, тестировик
- важно:
- верификация корректности работы на разных устройствах
- воспроизводимость ошибок
- что конфигурировать:
- возможность работать только на 1 гпу
- подробное логирование
- отключение кэша для принудительной перекомпиляции
- тестирование на неподдерживаемых вендорах без падения с ошибкой
- Бенчмаркер
- важно:
- минимизация шума при измерениях
- воспроизводимость результатов
- сравнение разных конфигураций
- что конфигурировать:
- профайлинг очередей `CL_QUEUE_PROFILING_ENABLE`
- сбор статистики и уменьшение шума `CLCounterPool`
- количество очередей для измерения параллелизма
- линейный аллокатор для предсказуемости памяти
- Wave size override
- Work-group size
- оптимизация доступа к глобальной памяти
- Расширяющий функциональность
- важно:
- возможность встроить код в существующую инфраструктуру
- чтобы новый код работал на всех устройтсвах
- что конфигурировать:
- включение кэша
- кастомные аллокаторы для разных форматов данных
- управление очередями
- Wave size override
- Work-group size

# Что нужно конфигурировать
1. Выбор платформы
2. Выбор устройства
3. Количество очередей: сейчас создается только 1 очередь
4. Приоритеты очередей
5. Размер линейного аллокатора `DEFAULT_SIZE`
6. Стратегия выбора аллокатора: \
NVIDIA используют общий аллокатор \
Все остальные используем линейный аллокатор
7. Характеристики устройтсв:\
`m_vendor_id` \
`m_max_cu` \
`m_default_wgs` \
`m_max_local_mem` \
`m_addr_align` \
пороги `m_max_wgs`, `m_max_cu`, `m_wave_size`
8. Строковые паттерны проверки девайса: возможно только 3 вариаета `m_vendor_name`
6. Дефолтные значения характеристик \
`m_addr_align` \
`m_default_wgs` \
`uint m_wave_size` \
`uint m_num_of_mem_banks`
7. Суффикс и имя \
`m_name` \
`m_suffix `
8. Тип устройства (чтобы можно было использовать CPU)
`getDevices`

# Структура конфига (JSON)

```bash
config:

"platform":
"selection":
Comment thread
gsvgit marked this conversation as resolved.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не понимаю по названию, что это за блок и почему он так назван.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

способ выбора платформы: можно по названию пользователя, по официальному имени и по вендору. Мне кажется, это естественные поля

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

для устройства то же самое

"user_alias": string
"official_name": string
"vendor": "nvidia" | "amd" | "intel" | "img" | ""
"index": int
"priority": int
"fallback": (???) # Нужен ли fallback
"device":
"selection":
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Такая же история.

"user_alias": string
"official_name": string
"type": "gpu" | "cpu"
"index": int
"priority": int
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кажется, про очериди ничего нету.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

priority не достаточно?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я вот про эти очереди: Количество очередей: сейчас создается только 1 очередь При чём тут priority?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тогда я не очень понимаю, что в контексте спла значит очередь и какие у нее параметры

"naming":
"accelerator_name" # m_name
"cache_suffix" # m_suffix
"tuning":
"default_work_group_size": int # m_default_wgs
"wave_size": int # m_wave_size
"memory_banks": int # m_num_of_mem_banks
"memory_alignment": int # m_addr_align
"fallback": (???) # Нужен ли fallback
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем их два?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 fallback, если не нашли платформу, 2 fallback, если не нашли девайс

"performance"
"memory"
"linear_allocator_size_mb": int # DEFAULT_SIZE
"allocator_strategy": "auto" | "linear" | "general" | "vendor"
"vendor_strategy":
"nvidia": "linear" | "general"
"amd": "linear" | "general"
"intel": "linear" | "general"
"img": "linear" | "general"
"queues":
"count": int

```

Loading