Параллельный доступ к элементам в одной и той же кэш-линии в кэш-памяти общего доступа в x86-64 - PullRequest
1 голос
/ 02 сентября 2011

Предположим, у меня есть следующий код:

int x[200];

void thread1() {
  for(int i = 0; i < 100; i++)
    x[i*2] = 1;
}

void thread2() {
  for(int i = 0; i < 100; i++)
    x[i*2 + 1] = 1;
}

Корректен ли код в модели памяти x86-64 (насколько я понимаю), если на странице была настроена политика кэширования записи по умолчанию в Linux? Как влияет на производительность такой код (насколько я понимаю - нет)?

PS. Что касается производительности - меня больше всего интересует Sandy Bridge.

РЕДАКТИРОВАТЬ: Как и ожидалось - я хочу писать в выровненные места из разных потоков. Я ожидаю, что верхний код после финиша и барьера будет содержать {1,1,1, ...} в x вместо {0,1,0,1,...} или {1,0,1,0,...}.

1 Ответ

1 голос
/ 02 сентября 2011

Если я правильно понимаю, записи в конечном итоге будут распространяться путем отслеживания запросов. Sandy Bridge использует Quick Path между ядрами, поэтому отслеживание не затронет FSB, но будет использовать гораздо более быстрое соединение. Так как он не основан на кэшировании-недействительности-при-записи, он должен быть «довольно быстрым», хотя я не смог найти, что является издержками при разрешении конфликтов (но, вероятно, ниже, чем при записи L3).

Источник

РЕДАКТИРОВАТЬ : в соответствии с Справочное руководство по оптимизации архитектур Intel® 64 и IA-32 Чистый удар воздействует на 43 цикла, а грязный - на 60 циклов (по сравнению с 4 циклами). обычные накладные расходы для L1, 12 для L2 и 26-31 для L3).

...