2013-09-07 1 views
0

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

ответ

2

Большинство процессоров (в частности, x86 в наших ноутбуках, настольных компьютерах, серверы) имеют аппаратное обеспечениеcache coherence

Часто, некоторая синхронизация memory barrier instructions есть.

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

На самом деле, последние стандарты и C2011 имеют специфические формулировки и atomic типов данных, чтобы иметь дело с этим, как C++ 11 std::atomic

На практике, вы должны использовать некоторые хорошо изученную стандартную библиотеку как pthreads (или C++ 11 std::thread и т. Д.)

1

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

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

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

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

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

+0

Хороший ответ, но одна коррекция - копии не обязательно одинаковы - строка может быть в модифицированном состоянии на нескольких уровнях кеша. В этом случае уровень, ближайший к ядру, имеет приоритет, поскольку это последняя модификация (L1> L2 и т. Д.). Однако линия не может находиться в состоянии M в нескольких кэшах на одном уровне (например, L1 на нескольких ядрах). Кроме того, в системах с несколькими гнездами вы можете иметь дополнительные осложнения. – Leeor