2014-02-14 52 views
5

Как я понимаю вещи, для perfromance на системах NUMA, есть два случая, чтобы избежать:NUMA система, виртуальные страницы и ложный обмен

  1. нити в том же сокете запись на одной и ту же строку кэша (обычно 64 байт)
  2. нити из разных гнезд, пишущих на одной и той же виртуальной страницы (обычно 4096 байт)

простой пример поможет. Предположим, что у меня есть две системы сокетов, и каждый сокет имеет процессор с двумя физическими ядрами (и двумя логическими ядрами, то есть без гиперпотока Intel или двух ядер AMD на модуль). Позвольте мне одолжить биграмма на OpenMP: for schedule

| socket 0 | core 0 | thread 0 | 
|    | core 1 | thread 1 | 

| socket 1 | core 2 | thread 2 | 
|    | core 3 | thread 3 | 

Так на основе случая 1, лучше избегать, например, нить 0 и поток 1, записывающие в одну и ту же строку кэша, и на основании случая 2 лучше избегать, например. thread 0 writing to the same virtual page as thread 2.

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

Действительно ли дело два больше не проблема? И если все еще проблема, для чего это правильная терминология? Правильно ли назвать оба случая своего рода ложным обменом?

+0

Ваш источник для «Я был проинформирован»? – timday

+0

@timday, это в комментариях здесь. У меня нет системы NUMA. Я знаю только то, что я читаю, и из того, что я прочитал, случай 2 все еще применяется, но теперь я не знаю. –

+1

opps ... Я имею в виду в комментариях здесь http: // stackoverflow.ком/вопросы/21741802/почему-бы-распараллеливание-понижени производительности так резко/21748825 # 21748825 –

ответ

2

Вы правы случае 1. Некоторые подробности о деле 2:

на основе операционной системы NUMA policy и любые связанные migration issues, физическое расположение страницы, темы, 0 и 2 пишем мог сокет 0 или сокет 1. Корпусы симметричны, поэтому скажем, что есть first touch policy, и этот поток 0 попадает туда первым. Последовательность операций может быть:

  1. Тема 3 выделяет страницу.
  2. Тема 0 записывает в строку кэша, над которой она будет работать. Эта строка кэша transitions from invalid to modified в кеше (-ах) на сокете 0.
  3. Тема 2 записывает в строку кэша, над которой она будет работать. Чтобы поместить эту строку в исключительное состояние, сокет 1 должен отправить Read To Ownership в сокет 0 и получить ответ.
  4. Темы 0 и 2 могут заниматься своим делом. Пока нить 0 не касается линии кэша нити 2 или наоборот, и никто другой не делает ничего, что могло бы изменить состояние любой строки, все операции, которые выполняются нитью 0 и потоком 2, являются сокетными (и возможно ядром) локальными ,

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

Смежные вопросы