В данном докладе рассматривается пример использования персистентной структуры данных - функциональной версии HAMT, для создания main memory базы данных. Данная реализация HAMT располагается в shared memory и используется для хранения индексов.
Рассматриваются задачи, которые были быстро и эффективно решены благодаря использованию неизменяемых структур данных (управление изменениями, поддержка ACID-свойств), а также проблемы, возникшие из-за этого. Также, рассмотрен метод реализации персистентного графа, использующий изменяемые данные и позволяющий достичь большей производительности, по сравнению с аналогичной, неизменяемой структурой данных.
Архитектура и программирование потоковых многоядерных процессоров для научных...a15464321646213Слайды лекции курса "Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов".
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey PaznikovЛЕКЦИЯ 1. Основные понятия стандарта MPI. Дифференцированные обмены
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
разработка серверов и серверных приложений лекция №2Eugeniy TyumentcevПричины потерь процессорного времени при организации последовательности вычислений внутри потока: 1. Ожидание ответа на запрос (поток спит). 2. Выполнение дополнительных "лишних" действий. Как способ устранения этих потерь - паттерн Пул потоков. Анализ императивного и функционального подхода к борьбе с "жадными" операциями. Эволюция методов организации параллельных вычислений на основе пула потоков.
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail KurnosovОптимизация доступа к памяти (Memory access optimization, cache optimization)
разработка серверов и серверных приложений лекция №3Eugeniy TyumentcevВ третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
Проблемы 64-битного кода на примерахTatyanazaxarovaСтатья представляет собой рассмотрение примеров реальных проблем в Си++ коде, проявляющихся при разработке 64-битных решений.
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail KurnosovОптимизация ветвлений и циклов (Branch prediction and loop optimization)
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...Alexey PaznikovЛЕКЦИЯ 7. Модель памяти С++. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey PaznikovДоклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_byВ C++11 добавили новое ключевое слово - constexpr. Выглядит оно весьма невзрачно, да и на первый взгляд кажется, что смысла в нём маловато... Для чего же оно нужно, какие у него есть тайные супер способности и какую роль оно сыграет в дальнейшем развитии языка C++ - обо всём об этом мы и поговорим.
Паттерны 64-битных ошибок в играхAndrey KarpovНаписание на C и C++ 64-битных программ, работающих с большими массивами данных, требует особой аккуратности. В 64-битном коде встречаются особые трудноуловимые ошибки, о которых редко рассказывают в книгах или на конференциях. Автор рассмотрит паттерны 64-битных ошибок и даст рекомендации, как писать код, защищённый от них.
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...OnticoОперативная память становится всё более дешёвой и производительной, что позволяет использовать её для хранения рабочего набора данных всё большего числа приложений. Хранение всех данных в оперативной памяти позволяет сделать их высоко доступными, а алгоритмы для работы с данными либо существенно упростить, либо ускорить, а иногда — и то, и другое.
Тезисы - http://www.highload.ru/2015/abstracts/1964.html
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...OnticoРИТ++ 2017, HighLoad Junior
Зал Сингапур, 5 июня, 11:00
Тезисы:
http://junior.highload.ru/2017/abstracts/2683.html
Наш доклад описывает способ использования больших объемов памяти, которые стали доступны в последние годы. К сожалению, эта память обычно остается незадействованной в управляемых средах исполнения в связи с принудительной сборкой мусора. Разработчики прибегают к внешним хранилищам данных ( i.e Memcached), что несет дополнительные расходы.
...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail KurnosovОптимизация доступа к памяти (Memory access optimization, cache optimization)
разработка серверов и серверных приложений лекция №3Eugeniy TyumentcevВ третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
Проблемы 64-битного кода на примерахTatyanazaxarovaСтатья представляет собой рассмотрение примеров реальных проблем в Си++ коде, проявляющихся при разработке 64-битных решений.
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail KurnosovОптимизация ветвлений и циклов (Branch prediction and loop optimization)
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...Alexey PaznikovЛЕКЦИЯ 7. Модель памяти С++. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey PaznikovДоклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_byВ C++11 добавили новое ключевое слово - constexpr. Выглядит оно весьма невзрачно, да и на первый взгляд кажется, что смысла в нём маловато... Для чего же оно нужно, какие у него есть тайные супер способности и какую роль оно сыграет в дальнейшем развитии языка C++ - обо всём об этом мы и поговорим.
Паттерны 64-битных ошибок в играхAndrey KarpovНаписание на C и C++ 64-битных программ, работающих с большими массивами данных, требует особой аккуратности. В 64-битном коде встречаются особые трудноуловимые ошибки, о которых редко рассказывают в книгах или на конференциях. Автор рассмотрит паттерны 64-битных ошибок и даст рекомендации, как писать код, защищённый от них.
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...OnticoОперативная память становится всё более дешёвой и производительной, что позволяет использовать её для хранения рабочего набора данных всё большего числа приложений. Хранение всех данных в оперативной памяти позволяет сделать их высоко доступными, а алгоритмы для работы с данными либо существенно упростить, либо ускорить, а иногда — и то, и другое.
Тезисы - http://www.highload.ru/2015/abstracts/1964.html
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...OnticoРИТ++ 2017, HighLoad Junior
Зал Сингапур, 5 июня, 11:00
Тезисы:
http://junior.highload.ru/2017/abstracts/2683.html
Наш доклад описывает способ использования больших объемов памяти, которые стали доступны в последние годы. К сожалению, эта память обычно остается незадействованной в управляемых средах исполнения в связи с принудительной сборкой мусора. Разработчики прибегают к внешним хранилищам данных ( i.e Memcached), что несет дополнительные расходы.
...
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryTatyanazaxarovaВ этой статье Анатолий Кузнецов отвечает на вопросы и рассказывает об открытой библиотеке BitMagic C++ Library.
Machine learning c использованием нейронных сетей, Дмитрий ЛапинIT61Обзор популярных фреймворков для обучения нейронных сетей, поделюсь собственным опытом их внедрения. Расскажу об использовании готовых предобученных сетей "как есть", дообучении (fine-tuning) и обучении собственных сетей с нуля.
Не бойся, это всего лишь данные... просто их многоRoman DvornovЗа последние 15 лет веб сильно изменился и ускорился. Но большинство по-прежнему боится большого количества данных и сложной логики на клиенте. Потому что "тормозит".
Я хочу сломать стереотипы и показать, как начать делать крутые штуки на client-side. Тысячи и сотни тысяч объектов, разные типы, зависимые вычисляемые свойства, агрегация, множество вариантов отображения. Все это в вашем браузере. Без тормозов, регистраций, смс.
Видео этого доклада на конференции DUMP, Екатеринбург, 14 марта 2014: https://vimeo.com/90836493
2012-12-01 03 Битва ORM: Hibernate vs MyBatis. Давайте жить дружно!Омские ИТ-субботникиРассказ об опыте использования двух разных ORM на одном Java-проекте, освещение их преимуществ, недостатков и границ применимости
2. План
1. CIMDB, постановка задачи
2. Решение задачи, использующее могучую
персистентную структуру данных
3. Еще больше интересных структур данных
3. CIMDB
● Main memory база данных, созданная в
компании "Монитор Электрик" (Пятигорск)
4. CIMDB
1. Common Information Model (CIM).
2. Большой граф объектов, порядка 1KK
элементов.
3. Используется для представления
элементов энергосистемы.
4. Нужно поддерживать целостность
данных.
5. Используется сложными расчетными
задачами.
5. Немного истории
● Первая реализация - реляционная
модель.
○ Каждая расчетная задача реализует чтение и
кеширование объектов модели.
○ Множество дублирующих друг друга ad-hoc
реализаций.
○ SQL JOIN
■ Дай мне все высоковольтные линии,
связанные с подстанциями, принадлежащими
определенной генерирующей компании.
○ Нет API
6. Немного истории
● Вторая реализация - client-side cache.
○ Решает проблемы:
■ изобретения велосипеда.
■ общий API.
■ могучие join-ы выполняются на клиенте, в
памяти.
○ И создает:
■ Проблему целостности данных.
● Инвалидация кэша
■ Shared mutable state.
● Shared + mutable = PITA
■ Пессимистичные блокировки.
● Блокировки реализованы на уровне БД
■ Использует очень много памяти.
7. Требования
● Распределенность.
● Транзакционность.
○ Нужно поддерживать ACID свойства.
○ Tradeoff - целостность достаточно поддерживать
в рамках модели timeline consistency.
○ Оптимистичные блокировки.
● Performance.
○ Нужно очень быстро читать, на уровне
предыдущей версии.
○ Писать можно не очень быстро.
8. Странное и необъяснимое
1. Инспектирование изменений и
управление "миром".
a. Нужно для технологических задач.
2. Очень быстрое создание снепшотов и
веток изменений.
a. Нужно для расчетных задач.
9. Возможные решения
Чтение данных через TCP/UDP/Pipes
слишком медленно.
a. Время одного round trip-а - десятки/сотни
микросекунд.
b. Требует кэширования на клиенте.
c. Кэш должен уметь prefetch.
10. Выход
Поместить клиент и сервер на одну машину,
обмениваться данными через общую
память.
Проблема синхронизации доступа к общей
памяти.
11. Архитектура.
● Все объекты - неизменяемы. При
изменении объекта, создается новая
версия (MVCC).
● У объекта нет номера ревизии, версии
или метки времени.
● Поиск объектов производится через
индекс. Для каждой версии существует
отдельный индекс.
13. Архитектура
Персистентные структуры данных -
естественный выбор в данной ситуации.
● Позволяют иметь одновременно
несколько версий одной структуры
данных, соответствующих разным
моментам времени.
● Версии не являются полными копиями и
разделяют часть данных.
14. Persistency
1. Partially persistent
○ Линейная история
○ Достаточно для реализации MVCC
2. Fully persistent
○ История изменений имеет форму дерева
○ Нужно для реализации веток изменений и
изоляции транзакций
15. Хэш таблицы
● Очень быстрый поиск по ключу
● Коллизии
○ Коллизии возможны даже в том случае, если
значения hash функции отличаются.
○ В нашем случае, у всех объектов есть
уникальный hash.
● Невозможно сделать неизменяемой
○ Можно держать индекс в памяти каждого
приложения, но это все усложняет.
16. Бинарные деревья + path copying
Функциональные
версии различных
сбалансированны
х деревьев.
17. Бинарные деревья
● Медленно
○ Скорость поиска по Id должна быть сравнима с
hash таблицей.
● Глубина пропорциональна log2 N
● Для N = 1KK глубина дерева ~= 20
18. Префиксные деревья
● Глубина дерева ограничена длиной ключа
● Find, Insert, Delete - O(1)
● Компактное представление в памяти
● Можно сделать персистентным
19. Префиксные деревья
● Задача состоит в том, чтобы эффективно
находить следующий узел.
● Можно использовать фрагмент ключа в
качестве индекса массива.
21. Префиксные деревья
Для поиска следующего элемента в дереве
мы должны вычислить:
Find(int hash)
index = hash & 0x1F
next = this.array[index]
if next != null:
next.Find(hash >> 5)
...
25. HAMT
Каждый узел хранит:
● Количество дочерних элементов
● Массив дочерних элементов
○ Пара ключ - значение
○ Указатель на следующий узел
● Bitmap
26. HAMT
struct Node {
int count;
Node[count] array;
int bitmap;
}
● Узел хранит только неравные null
элементы
● А также битовую маску для вычисления
индекса
27. HAMT
Find(int hash)
int shift = hash & 0x1F
int mask = (1 << shift) - 1
int index = Popcnt(this.bitmap & mask)
next = this.array[index]
next.Find(hash >> 5)
Вычисляем значение ключа для поиска
28. HAMT
Find(int hash)
int shift = hash & 0x1F
int mask = (1 << shift) - 1
int index = Popcnt(this.bitmap & mask)
next = this.array[index]
next.Find(hash >> 5)
(1 << shift) вернет слово, в котором будет
установлен 1 бит, индекс которого равен
индексу в несжатом массиве из 32х
элементов
29. HAMT
Find(int hash)
int shift = hash & 0x1F
int mask = (1 << shift) - 1
int index = Popcnt(this.bitmap & mask)
next = this.array[index]
next.Find(hash >> 5)
(1 << shift) - 1 - мы получаем маску, в
которой установлены все биты, чей индекс
меньше индекса искомого элемента
30. HAMT
Find(int hash)
int shift = hash & 0x1F
int mask = (1 << shift) - 1
int index = Popcnt(this.bitmap & mask)
next = this.array[index]
next.Find(hash >> 5)
Popcnt - возвращает количество ненулевых
бит в слове.
31. HAMT
Find(int hash = 5)
int shift = 5 & 0x1F
int mask = (1 << 5) - 1
int index = Popcnt(100001b & 11111b)
next = this.array[1]
next.Find(hash >> 5)
bitmap =
00000000000000000000000000100001b
array = [a, b]
naive = [a, 0, 0, 0, 0, b, ...
32. HAMT
Можно не сжимать узлы, имеющие
множество дочерних элементов.
Если предполагается наличие дубликатов,
нужен еще один тип узла для разрешения
конфликтов.
33. HAMT
Реализация на С# (прототип)
● В 2.5 - 3 раза медленнее чем Dictionary
● Расходует сопоставимое количество
памяти
● Нет коллизий
● Нагружает GC
34. HAMT
Реализация на Си (production)
● В несколько раз быстрее чем Dictionary
● Использует подсчет ссылок и не
нагружает GC
● Не использует атомарные инструкции
(lock xchg и тп) - очень быстро работает в
одном потоке
35. Pros
● Простота архитектуры
○ Клиент отправляет на сервер транзакции
○ В ответ получает указатель на root
○ Сообщает о переходе на новую версию
○ Очень похоже на VCS
● Сложные вещи реализуются очень просто
○ Очень дешево иметь множество слегка
отличающихся версий одной структуры данных
○ Очень легко реализуется изоляция транзакций
● Нет блокировок
○ Только координация посредством сообщений
36. Cons
● Возможны утечки памяти
○ Но только если клиент неправильно работает
● Все еще низкая производительность в
некоторых случаях :)
37. Ссылки
● Каждый объект может ссылаться на
другие объекты.
● Физически, эти ссылки реализованы как
массивы идентификаторов связанных
объектов.
● Всегда есть обратные ссылки.
38. Ссылки
● Ходить по ссылкам через индекс -
достаточно дорого.
● Можно ли хранить внутри объектов не
только идентификаторы, но и указатели
на другие объекты?
39. Ссылки
● Любую связную структуру данных можно
сделать частично или полностью
персистентной
● При определенных условиях - за O(1)
времени и памяти
● "Making Data Structures Persistent" by
James R. Driscoll, Neil Sarnak, Daniel D.
Sleator, Robert E. Tarjan
40. Принцип работы
● Каждый объект может опционально
хранить один или несколько указателей
на связанные с ним объекты.
● Каждый объект получает дополнительное
поле - modification box (m-box)
● m-box может хранить информацию об
изменениях указателей
● С каждым изменением связан номер
версии
42. Pros
● Быстрый переход по ссылкам
● Более быстрая проверка ссылочной
целостности при commit-е
43. Cons
● Нужно больше памяти
● И процессорного времени при
обновлениях
● Для чтения нужно знать номер ревизии
● Можно обеспечить только частичную
персистентность, это означает что:
○ Никаких указателей в ветках
○ Никаких указателей в транзакциях
44. Вывод
Данный подход выгодно использовать
только опционально, не для всех типов
объектов и не для всех ссылок.