Кто-нибудь пробовал транзакционную память для C ++?

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

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


person Robert Gould    schedule 17.09.2008    source источник
comment
Актуальны ли этот вопрос и ответы на него?   -  person Janus Troelsen    schedule 13.06.2017
comment
@JanusTroelsen ознакомьтесь с доступными реализациями в en.m.wikipedia.org/wiki/Transactional_memory   -  person Adam Davis    schedule 13.06.2017
comment
По теме: realworldtech.com/haswell-tm для описания Дэвида Кантера некоторых недооцененных подробности о том, как это на самом деле реализовано на процессорах Intel. А также кое-что интересное о транзакционной памяти в целом.   -  person Peter Cordes    schedule 22.11.2017


Ответы (5)


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

Источник: Саттер говорит: будущее параллелизма

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

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

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

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

person Brian Stewart    schedule 17.09.2008
comment
О том, где это слишком сложно для разработчиков: см. Статью Россбаха и др. «На самом деле проще ли транзакционное программирование»: cs.utexas.edu/~rossbach/pubs/wddd09-rossbach.pdf - person amit; 28.10.2011

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

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

person Kris Kumler    schedule 17.09.2008

Я построил комбинаторную библиотеку 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;
};

ОБНОВЛЕНИЕ Я написал руководство, вы можете найти его здесь .

person Alexander Granin    schedule 02.04.2018

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

Интересный доклад на эту тему, сделанный Марком Мойром, одним из исследователей в Sun, работающим над Transactional Memory and Rock, можно найти в этом " noreferofrerer

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

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

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

person fuad    schedule 17.09.2008

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

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

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

-Адам

person Adam Davis    schedule 17.09.2008
comment
Это не похоже на транзакционную память ... Каковы накладные расходы по сравнению с мьютексами и семафорами? - person Andres Jaan Tack; 19.11.2009
comment
Есть несколько мест, где накладные расходы выше. Один очевидный пример - откат транзакции. Это также усложняет кэширование и увеличивает накладные расходы, поскольку все должно быть немедленно записано в память. Транзакционная память - хорошая идея для некоторых приложений, но она влияет на производительность системы, и поэтому ее не следует развертывать для каждого приложения и системы. - person Adam Davis; 19.11.2009
comment
Ах, но множественные перезапуски - это патологический случай для транзакций. Как это соотносится с патологическим случаем блокировок (длительное блокирование, переход между тайниками)? - person Andres Jaan Tack; 19.11.2009
comment
Этот пост все еще актуален? - person Janus Troelsen; 13.06.2017
comment
@JanusTroelsen: текущая реализация Intel (Broadwell / Skylake) не блокирует прерывания, а прерывает транзакцию. См. realworldtech.com/haswell-tm для получения дополнительной информации о том, как это работает под капотом. (AFAIK базовый дизайн такой же в Skylake и Haswell, хотя у HSW были ошибки, которые требовали его отключения в udpate микрокода.) В основном он добавляет некоторые дополнительные биты в кеш L1D и прерывает транзакцию, если происходит что-то сложное. - person Peter Cordes; 22.11.2017