Как будет использоваться общая память во многих основных системах - PullRequest
0 голосов
/ 21 сентября 2011

В многоядерных системах, таких как 2, 4, 8 ядер, мы обычно используем мьютексы и семафоры для доступа к общей памяти. Тем не менее, я могу предвидеть, что эти методы вызовут большие издержки для будущих систем со многими ядрами. Существуют ли альтернативные методы, которые были бы лучше в будущем для многих основных систем для доступа к общей памяти.

Ответы [ 4 ]

6 голосов
/ 21 сентября 2011

Транзакционная память является одним из таких методов.

2 голосов
/ 21 сентября 2011

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

Но сейчас (возможно, еще на 10 лет) вы можете сойти с руктранзакционная память и другие аппаратные / программные хитрости.

Причина, по которой я говорю, что разделяемая память не масштабируема в долгосрочной перспективе, просто связана с физикой.(аналогично тому, как одноядерный / высокочастотный удар по барьеру)

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

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

0 голосов
/ 01 марта 2012

Доступ к общей памяти на самом низком уровне в любой многопроцессорной / базовой / многопоточной синхронизации приложений зависит от блокировки шины.Такая блокировка может вызывать сотни состояний ожидания (CPU), поскольку она также включает блокировку тех шин ввода-вывода, которые имеют устройства мастеринга шины, включая DMA.Теоретически возможно представить блокировку среднего уровня, которая может быть вызвана в ситуациях, когда программист уверен, что на заблокированную область памяти не будет влиять какая-либо шина ввода-вывода.Такая блокировка была бы намного быстрее, потому что ей нужно только синхронизировать кэши ЦП с основной памятью, что является быстрым, по крайней мере, по сравнению с задержкой самых медленных шин ввода-вывода.Если программисты в целом будут компетентны определять, когда использовать, какая блокировка шины добавляет тревожные последствия к ее основной осуществимости.Такая блокировка может также потребовать своих собственных выделенных внешних выводов для синхронизации с другими процессорами.

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

Теоретическая блокировка среднего уровня может быть реализована в системах Opteron с использованием соединений HyperTransport.

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

0 голосов
/ 21 сентября 2011

1) Блокируйте только часть памяти, к которой вы обращаетесь, а не всю таблицу! Это делается с помощью большой хэш-таблицы. Чем больше стол, тем лучше механизм блокировки.

2) Если вы можете, блокировать только запись, а не чтение (для этого необходимо, чтобы при чтении «предыдущего значения» не возникало проблем при обновлении, что очень часто является допустимым случаем).

...