Помогает ли прикрепление процесса к ядру ЦП или узлу SMP снизить трафик когерентности кэша? - PullRequest
6 голосов
/ 27 февраля 2012

Можно привязать процесс к определенному набору ядер ЦП, используя вызов sched_setaffinity(). На странице руководства написано:

   Restricting a process to run on a single CPU also avoids the
   performance cost caused by the cache invalidation that occurs when a process
   ceases to execute on one CPU and then recommences execution on a different
   CPU.

Что является почти очевидной вещью (или нет?). Что не так очевидно для меня это -

Уменьшает ли закрепление LWP на конкретном ЦП или узле SMP трафик шины когерентности кэша? Например, поскольку процесс выполняется закрепленным, другие процессоры не должны изменять свою частную память, поэтому только процессоры, являющиеся частью одного и того же узла SMP, должны оставаться связанными с кэшем.

Ответы [ 2 ]

10 голосов
/ 27 февраля 2012

Не должно быть трафика когерентности сокета ЦП для описанного случая закрепленного процесса.Современные платформы Xeon реализуют фильтрацию с помощью snoop в чипсете.Фильтр snoop указывает, что на удаленном сокете не может быть рассматриваемой строки кэша, что позволяет избежать необходимости отправлять в этот сокет сообщения о недействительности кэша.

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

- EDIT -

Мой ответвыше устарел для процессоров серии 55xx, которые используют ссылки QPI.Эти ссылки напрямую соединяют сокеты ЦП без промежуточного набора микросхем, например: http://ark.intel.com/products/37111/Intel-Xeon-Processor-X5570-%288M-Cache-2_93-GHz-6_40-GTs-Intel-QPI%29

Однако, поскольку кэш L3 в каждом ЦП является включающим, отслеживание по каналам QPI происходит, только когда локальный кэш L3 указывает строкунигде в локальном сокете.Точно так же L3 удаленного сокета может быстро реагировать на перекрестное отслеживание, не мешая ядрам, при условии, что линии тоже нет.

Таким образом, включающие кэши L3 должны минимизировать издержки когерентности между сокетами.не из-за снуп-фильтра чипсета в вашем случае.

7 голосов
/ 27 февраля 2012

Если вы работаете в системе NUMA (например, на сервере Opteron или Itanium), это имеет смысл, но вы должны обязательно связать процесс с тем же узлом NUMA , из которого он выделяет память. В противном случае это антиоптимизация. Следует отметить, что любая операционная система, поддерживающая NUMA, в любом случае попытается сохранить выполнение и память на одном и том же узле, если вы вообще ничего не говорите, в меру своих возможностей (некоторые старые версии Windows довольно плохие). в этом, но я не ожидал бы, что это будет в случае с последним Linux).

Если вы не работаете в системе NUMA, привязка процесса к определенному ядру - это самая большая глупость, которую вы можете сделать. ОС не будет заставлять процессы подпрыгивать между процессорами для развлечения, и если процесс должен быть перемещен на другой процессор, то это не идеально, но и мир не заканчивается. Это случается редко, и когда это произойдет, вы вряд ли сможете сказать.
С другой стороны, если процесс связан с ЦП, а другой ЦП находится в режиме ожидания, ОС не может его использовать ... это означает, что 100% доступной вычислительной мощности уходит в канализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...