Кто-нибудь пробовал транзакционную память на C ++? - PullRequest
10 голосов
/ 17 сентября 2008

Я проверял сайт Intel "whatif" и их компилятор транзакционной памяти (каждый поток должен делать атомарные коммиты или откатывать память системы, как это делает база данных).

Это выглядит как многообещающий способ заменить замки и мьютексы, но я не могу найти много отзывов. У кого-нибудь здесь есть какой-нибудь вклад?

Ответы [ 5 ]

8 голосов
/ 17 сентября 2008

Я не использовал компилятор Intel, однако у Херба Саттера было несколько интересных комментариев по этому поводу ...

С Саттер говорит: будущее параллелизма

Видите ли вы большой интерес к использованию транзакционной памяти или ее слишком сложно для большинства разработчиков понять?

Пока невозможно ответить, кто его использовал, потому что он еще не поступил на рынок. У Intel есть программный прототип компилятора транзакционной памяти. Но если вопрос таков: «Слишком сложно для разработчиков?» Ответ в том, что я, конечно, надеюсь, что нет. Все дело в том, что это намного проще, чем замки. Это единственная важная вещь на горизонте исследований, которая дает надежду значительно сократить использование замков. Он никогда не заменит замки полностью, но наша единственная большая надежда - заменить их частично.

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

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

4 голосов
/ 17 сентября 2008

Dr. В прошлом году у Добба была статья о концепции: «Транзакционное программирование» Калума Гранта - http://www.ddj.com/cpp/202802978

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

3 голосов
/ 02 апреля 2018

Я построил комбинаторную библиотеку STM поверх некоторых идей функционального программирования. Он не требует поддержки компилятора (за исключением того, что использует C ++ 17), не привносит новый синтаксис. В общем, он принимает интерфейс библиотеки STM от Haskell.

Итак, моя библиотека имеет несколько приятных свойств:

  • Монадически комбинаторный. Каждая транзакция является вычислением внутри пользовательской монады с именем STML. Вы можете объединять монадические транзакции в более крупные монадические транзакции.
  • Транзакции отделены от модели данных. Вы создаете свою параллельную модель данных с переменными транзакций (TVars) и выполняете транзакции по ней.
  • Есть retry комбинатор. Это позволяет повторно выполнить транзакцию. Очень полезно для построения коротких и понятных транзакций.
  • Существуют различные монадические комбинаторы, которые в скором времени выражают вычисления.
  • Есть Context. Каждое вычисление должно выполняться в некотором контексте, а не в глобальной среде выполнения. Таким образом, вы можете иметь много разных контекстов, если вам нужно несколько независимых кластеров STM.
  • Реализация концептуально довольно проста. По крайней мере, справочная реализация в Haskell такова, но мне пришлось заново изобрести несколько подходов к реализации C ++ из-за отсутствия хорошей поддержки функционального программирования.

Библиотека демонстрирует очень хорошую стабильность и надежность, даже если мы считаем ее экспериментальной. Более того, мой подход открывает множество возможностей для улучшения библиотеки за счет производительности, возможностей, полноты и т. Д.

Чтобы продемонстрировать его работу, я решил задачу Dining Philosophers. Вы можете найти код по ссылкам ниже. Пример транзакции:

STML<bool> takeFork(const TVar<Fork>& tFork)
{
    STML<bool> alreadyTaken = withTVar(tFork, isForkTaken);
    STML<Unit> takenByUs    = modifyTVar(tFork, setForkTaken);
    STML<bool> success      = sequence(takenByUs, pure(true));
    STML<bool> fail         = pure(false);
    STML<bool> result       = ifThenElse(alreadyTaken, fail, success);
    return result;
};

UPDATE Я написал учебник, вы можете найти его здесь .

1 голос
/ 18 сентября 2008

Sun Microsystems объявила о выпуске нового процессора в следующем году под кодовым названием Rock, который имеет аппаратную поддержку транзакционной памяти. У него будут некоторые ограничения, но это хороший первый шаг, который облегчит программистам замену блокировок / мьютексов транзакциями и , ожидающими от этого хорошей производительности.

Интересный доклад на эту тему, прочитанный Марком Мойром, одним из исследователей Sun, занимающихся транзакционной памятью и роком, можно найти по этой ссылке .

Для получения дополнительной информации и объявлений Sun о Rock и транзакционной памяти в целом, эта ссылка .

Обязательная запись в википедии :)

Наконец, эта ссылка в Университете Висконсин-Мэдисон содержит библиографию большинства исследований, которые проводились и проводятся в отношении транзакционной памяти, будь то аппаратное или программное обеспечение *. 1019 *

0 голосов
/ 17 сентября 2008

В некоторых случаях я считаю это полезным и даже необходимым.

Однако, даже если у процессора есть специальные инструкции, которые облегчают этот процесс, все равно остаются большие издержки по сравнению с мьютексом или семафором. В зависимости от того, как это реализовано, это также может повлиять на производительность в реальном времени (придется либо прерывать прерывания, либо препятствовать их записи в ваши общие области).

Я ожидаю, что, если это будет реализовано, оно потребуется только для частей данного пространства памяти, и поэтому влияние может быть ограничено.

-Adam

...