В отношении не-временных операций записи и записи комбинирования методов, я следующий код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 (который впоследствии изменяется)?
У меня это получилось, но как насчет части, где говорится: «Эта кодовая последовательность не только избегает чтения строки кэша до ее написания»? Вы объяснили мне эту часть: «она также позволяет избежать загрязнения кэша данными, которые могут быть не нужны в ближайшее время» –
@JohnnyPauling: 'i' будет выделен регистру, что означает, что в сгенерированном коде нет загрузок памяти, не будет запускаться, и кэш-строки будут созданы для него, когда он будет использоваться. – Necrolis
А ты прав, спасибо, что объяснил это мне: D –