Асинхронные программы, показывающие местность ссылки? - PullRequest
0 голосов
/ 27 сентября 2010

Я читал эту прекрасную статью, которая дает введение в асинхронное программирование здесь http://krondo.com/blog/?p=1209, и я наткнулся на следующую строку, которую мне трудно понять.

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

Может ли кто-нибудь объяснить, как здесь можно увидеть местность ссылок?

Ответы [ 2 ]

5 голосов
/ 27 сентября 2010

Местность ссылки, как упоминается в статье в Википедии, - это наблюдение, что когда к некоторым данным обращаются (на диске, в памяти и т. Д.), К другим данным рядом с этим местоположением также часто обращаются. Это наблюдение имеет смысл, поскольку разработчики, как правило, группируют сходные данные. Поскольку данные связаны, они часто обрабатываются вместе. В частности, это называется пространственной локализацией.

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

Компьютерная архитектура учитывает местность ссылок. Операционные системы имеют понятие «страниц», которые представляют собой (примерно) 4 КБ порции данных, которые можно выгружать и выгружать по отдельности (перемещать между физической памятью и диском). Когда вы дотрагиваетесь до некоторой памяти, которая не является резидентной (не физически в ОЗУ), ОС переносит всю страницу данных с диска в память. Причиной этого является местность: вы, скорее всего, будете касаться других данных вокруг того, что вы только что затронули.

Кроме того, в процессорах есть концепция кеширования. Например, ЦП может иметь кэш L1 (уровень 1), который на самом деле является просто большим блоком данных на ЦП, к которым ЦП может обращаться быстрее, чем ОЗУ. Если значение находится в кэше L1, ЦП будет использовать его вместо выхода в ОЗУ. Следуя принципу локальности ссылок, когда ЦП получает доступ к некоторому значению в основной памяти, он переносит это значение и все значения рядом с ним в кэш L1. Этот набор значений известен как строка кэша. Строки кэша различаются по размеру, но дело в том, что при доступе к первому значению массива ЦП может потребоваться получить его из ОЗУ, но последующий доступ (близость) будет быстрее, поскольку ЦП принес весь пакет значения в кэш L1 при первом доступе.

Итак, чтобы ответить на ваш вопрос: если вы представляете синхронный процесс, вычисляющий сумму очень большого массива, он будет касаться областей памяти по порядку один за другим. В этом случае ваша местность хорошая. Однако в асинхронном случае у вас может быть n потоков, каждый из которых берет часть массива (размером 1/n) и вычисляет подсумму. Каждый поток затрагивает потенциально очень разные места в памяти (так как массив большой), и поскольку каждый поток может быть включен и выключен, фактический шаблон доступа к данным с точки зрения ОС или ЦП является плохим. Кэш-память L1 в ЦП является конечной, поэтому, если поток 1 вводит строку кэша (из-за доступа), это может привести к удалению строки кэша потока 2. Затем, когда поток 2 переходит к доступу к значению своего массива, он должен перейдите к ОЗУ, которое снова введет в свою строку кеша и потенциально изгонит строку кеша потока 1 и так далее. В зависимости от системных ресурсов и использования в целом, этот шаблон может происходить и на уровне ОС / страницы.

1 голос
/ 27 сентября 2010

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

Он в конечном итоге ошибается, по крайней мере, для довольно многих программ.Причина довольно проста: даже если вы ничего не получите от кода с привязкой к ЦП, когда вы можете объединить код с привязкой к ЦП и код с привязкой к вводу / выводу, вы можете ожидать общего улучшения скорости.Вы можете, например, инициировать чтение или запись, затем переключиться на выполнение вычислений, пока диск занят, а затем переключиться обратно на связанный поток ввода-вывода, когда диск завершит свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...