2013-03-22 2 views
1

В отношении не-временных операций записи и записи комбинирования методов, я следующий кодWrite-combining: в какой строке кеша можно прочитать перед записью?

void setbytes(char *p, int c) 
{ 
__m128i i = _mm_set_epi8(c, c, c, c, 
c, c, c, c, 
c, c, c, c, 
c, c, c, c); 
_mm_stream_si128((__m128i *)&p[0], i); 
_mm_stream_si128((__m128i *)&p[16], i); 
_mm_stream_si128((__m128i *)&p[32], i); 
_mm_stream_si128((__m128i *)&p[48], i); 
} 

взяты из here

написано, что

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

Мой вопрос: в какой строке кеша не написано? Линия кэша, в которой хранится содержимое переменной i или строки кэша, в которой указывает указатель p (который впоследствии изменяется)?

ответ

3

о: «избегает чтения строки кэша перед записью»

Это утверждение относится к «записи выделения» политике для обработки операций записи, которые пропускают кэш. Все современные процессоры x86 делают это. Это происходит так: программное обеспечение записывает в память с помощью обычной команды mov. Если этот адрес уже кэширован, то кеш обновляется и вообще нет доступа к DRAM. Однако, если данные не находятся в кеше, процессор считывает эту строку кэша из DRAM. Затем данные из команды mov объединяются в данные в кеш. Процессор отложит запись данных обратно в DRAM как можно дольше. Конечный результат является интуитивно понятным: программное обеспечение выполняет инструкцию записи (mov) и один результат чтения (всплеска) DRAM. Если этот шаблон повторяется, кеш в конечном итоге станет полным, и выселения потребуются, чтобы освободить место для чтения. В этом случае будет записан пакет DRAM для записи несвязанного адреса строки кэша, после чего следует прочитать адрес, который записывает программное обеспечение. Это объясняет, почему невременные хранилища дают примерно 2X производительность для заполнения большого буфера. Только половина доступа DRAM происходит по сравнению с использованием mov для заполнения буфера.

1

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

так в вашем примере, если вы не читали из p (или вы очистили его из кэша с CLFLUSH), магазин потокового помешают данные записываются где p точек загружается в кэш для адреса указана на p (т. е. не будет создано cachline для адресов, записанных в).

+0

У меня это получилось, но как насчет части, где говорится: «Эта кодовая последовательность не только избегает чтения строки кэша до ее написания»? Вы объяснили мне эту часть: «она также позволяет избежать загрязнения кэша данными, которые могут быть не нужны в ближайшее время» –

+0

@JohnnyPauling: 'i' будет выделен регистру, что означает, что в сгенерированном коде нет загрузок памяти, не будет запускаться, и кэш-строки будут созданы для него, когда он будет использоваться. – Necrolis

+0

А ты прав, спасибо, что объяснил это мне: D –

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

  • Нет связанных вопросов^_^