Почему скорость записи в ОЗУ меньше скорости чтения? И как кеши попадают в картину?

5892
user2898278

Во-первых, это правда, правда? Я чувствую, что читает всегда будет быстрее, чем пишет, и этот парень здесь делают некоторые эксперименты, чтобы «доказать» это. Он не объясняет почему, просто упоминает «проблемы кеширования». (и его эксперименты, кажется, не беспокоятся о предварительной загрузке)

Но я не понимаю почему. Если это имеет значение, давайте предположим, что мы говорим об архитектуре Nehalem (например, i7), которая имеет кэш L1, L2 для каждого ядра, а затем общий кеш L3.

Вероятно, это потому, что я не правильно понимаю, как работает чтение и запись, поэтому я напишу свое понимание. Пожалуйста, скажите мне, если что-то не так.

If I read some memory, following steps should happen: (assume all cache misses)  1. Check if already in L1 cache, miss 2. Check if in L2 cache, miss 3. Check if in L3 cache, miss 4. Fetch from memory into (L1?) cache 

Не уверен насчет последнего шага. Проникают ли данные в кеши, что означает, что в случае пропадания кеша память сначала считывается в L3 / L2 / L1, а затем читается оттуда? Или он может «обойти» все кэши, а затем кэширование происходит параллельно для дальнейшего использования. (чтение = доступ ко всем кэшам + выборка из оперативной памяти в кэш + чтение из кэша?)

Then write:  1. All caches have to be checked (read) in this case too 2. If there's a hit, write there and since Nehalem has write through caches,  write to memory immediately and in parallel 3. If all caches miss, write to memory directly? 

Опять не уверен насчет последнего шага. Может ли запись быть сделана «в обход» всех кешей, или запись включает в себя всегда сначала чтение в кеш, изменение кешированной копии и возможность аппаратному обеспечению сквозной записи фактически выполнять запись в область памяти в ОЗУ? (запись = чтение всех кэшей + выборка из ОЗУ в кэш + запись в кэш, параллельная запись в ОЗУ ==> запись - это почти расширенный набор чтения?)

5
Пожалуйста, не кросс-пост между сайтами SE. Либо пометьте мод для запроса и / или подождите, пока мод перенесет ваш другой вопрос сюда. Если вы хотите, чтобы это было здесь, а не там, поскольку вы уже разместили оба места, рассмотрите возможность удаления и удаления из SO. Ƭᴇcʜιᴇ007 10 лет назад 1
Чтение чего-либо является пассивным, запись (изменение) чего-либо активным. Активность почти всегда тяжелее пассивности. ;) Ƭᴇcʜιᴇ007 10 лет назад 1
http://electronics.stackexchange.com/questions/17549/i-know-why-dram-is-slower-to-write-than-to-read-but-why-is-the-l1-l2-cache- ра Ƭᴇcʜιᴇ007 10 лет назад 0
@ user2898278 - У вас есть какие-нибудь источники, более надежные, чем случайный блог? Ramhound 10 лет назад 0
У вас здесь есть что-то элементарное неправильно. Каждый бит данных адресован ... нет никакого снижения уровней кеша при поиске данных, как если бы вы догадались. M.Bennett 10 лет назад 0
@ techie007, спасибо за ваш ответ. Я удалю это из ТАК. Как я уже сказал, я интуитивно понимаю, почему «чистая запись» должна быть несколько медленнее, чем «чистое чтение», и прочитал этот поток электроники перед публикацией, но я хочу знать о «фактическом» времени чтения и записи, включая все эффекты из-за кеширование, а не просто перемещение данных из ОЗУ в / из кеша («чистое» чтение / запись). user2898278 10 лет назад 0
@Ramhound, я также проверил это с помощью инструмента [lmbench] (http://lmbench.sourceforge.net/cgi-bin/man?keyword=bw_mem§ion=8). Я получил скорость записи значительно ниже, чем скорость чтения примерно в 1,5 раза. Хотя я не уверен насчет точности программы на современных процессорах. Но на самом деле данные распространяются по всему Интернету, что говорит о том, что запись выполняется намного медленнее, например [this] (http://zsmith.co/images/bandwidth-mbp15.gif). Но есть и некоторые данные, которые говорят об обратном, поэтому я не знаю, что происходит. [См.] (Http://forum.crucial.com/t5/Standard-DRAM-Memory/Simple-RAM-speed-test/td -p / 51176) user2898278 10 лет назад 0
@ M.Bennett, Каждый бит, конечно, адресуется внутри ОЗУ, но чтение и запись выполняются в кратных размерах строк кэша из ОЗУ. Когда вы говорите «каждый бит адресован», вы имеете в виду то же самое, что «обход кешей», как я написал в своем вопросе? Я не уверен, что процессор может читать / записывать напрямую из / в память в любой ситуации, или эти операции должны проходить через кеш (в первом случае было бы отдельное физическое соединение ч / б ОЗУ и процессора, я думаю, это тот случай?) user2898278 10 лет назад 0
Пожалуйста, добавьте свои данные к вашему вопросу. Ramhound 10 лет назад 0
@ user2898278 Это не дискуссионный форум. Если вы хотите обсудить это подробно, вам, вероятно, будет лучше [попасть в чат] (http://chat.stackexchange.com/) или в настоящий дискуссионный форум. Ƭᴇcʜιᴇ007 10 лет назад 0

2 ответа на вопрос

4
David

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

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

Для более подробной информации смотрите MSalters превосходный ответ на несколько похожий вопрос .

Я не достаточно уверен в деталях того, как кэширование взаимодействует с RAM, чтобы ответить на эту часть вопроса с какой-либо авторитетностью, поэтому я оставлю это кому-то другому.

Спасибо тебе за это. Теперь я лучше понимаю, почему «чистые» записи выполняются медленнее, чем чистые. Но как сильно влияют электронные факторы? Я имею в виду, будет ли разница только из-за электронных факторов в полосе пропускания для чтения и записи примерно в 1,5 раза? Есть идеи? (под чистым я имею ввиду исключение кешей) user2898278 10 лет назад 0
3
horta

Write Case: If you have something to write to memory and you have a good memory controller, ignoring all caching, all you have to do is send a transaction to the memory controller with the data you want written. Because of memory ordering rules, as soon as the transaction leaves the core, you can move on to the next instruction because you can assume the hardware is taking care of the write to memory. This means a write takes virtually no time at all.

Read Case: On the other hand, a read is an entirely different operation and is greatly assisted by caching. If you need to read in data, you can't go on to your next step in your program until you've actually got the data in hand. That means you need to check caches first and then memory to see where the data is. Depending on where the data is at, your latency will suffer accordingly. In a non-threading, non-pipelined core, non-prefetching system, you're just burning core cycles waiting on data to come back so you can move on to the next step. Cache and memory is orders of magnitude slower than core speed/register space. This is why reading is so much slower than a write.

Going back to the write transaction, the only issue you may run into with speed is if you're doing reads after a write transaction to the same address. In that case, your architecture needs to ensure that your read doesn't hop over your write. If it does, you'll get the wrong data back. If you have a really smart architecture, as that write is propagating out towards memory, if a read to the same address comes along, the hardware can return the data way before it ever gets out to memory. Even in this case of read-after-write, it's not the write that takes a while from the core's perspective, it's the read.

From a RAM perspective: Even if we're not talking about a core and we're only talking about RAM/memory controller, doing a write to the MC will result in the MC storing it in a buffer and sending a response back stating that the transaction is complete (even though it's not). Using buffers, we don't have to worry about actual DIMM/RAM write speeds because the MC will take care of that. The only exception to this case is when you're doing large blocks of writes and go beyond the capabilities of the MC buffer. In that case, you do have to start worrying about RAM write speed. And that's what the linked article is referring to. Then you have to start worrying about the physical limitations of reading vs writing speeds that David's answer touches on. Usually that's a dumb thing for a core to do anyway; that's why DMA was invented. But that's a whole other topic.

Похожие вопросы