pavia писал(а):
UC - чтение и запись не кешируется.
WT - чтение идет из кэша , операции чтения могут быть пере упорядочены. Но до первой команды на "запись"
WC - комбинирование команд "запись", запись может быть переупорядочена. Секрет в том что запись задерживается в буфере до его заполнения.
По сути WC - переводит CPU в пакетный режим передачи. Далее зависимость от шины и её протоколов. По идее должно быть не более 64 /4=16 раз. У старых компьютеров где кэш 32 байта ускорение в 8 раз.
Замеры говорят о более большей скорости!!
Секрет не столько в буферезации, сколько в переупорядочивании. Для UC памяти все операции должны быть строго упорядочены (strongly ordered), а все что за пределями CPU порядком операции не особо интересуется. То есть нельзя выпустить две последовательные UC операции одну за другой и надеяться, что они дойдут до цели в том же самом порядке, как того требует UC спецификация. Из-за этого ограничения следующий UC write может быть выполнен только после того как пришло подтвержение от предыдущего, которое гарантирует порядок выполнения (global observation). На деле это означает 50-70 тактов простоя как минимум между двумя строго упорядоченными операциями. В случае обращения к MMIO (типа графической памяти) может получить гораздо больше. У WC нет такого ограничения, порядок прибытия отдельных write не гарантирован вообще поэтому CPU может фигачить их наружу сразу по мере накопления всей строки кеша. При использовании SSE MOVNTPS - 16 byte per store, 4 такта на строку кеша. На деле все чуто помедленнее из-за внутренних ограничений внутри ядра CPU, но это верхний предел скорости. Как видишь 16x дело вообще не ограничивается.
Вообще - рукомендую почитать про Memory Ordering в том3 Intel Manuals а так же про Write Combining в Optimization Guide.
Станислав