Что означают термины «связанный с процессором» и «связанный с вводом / выводом»? - PullRequest
256 голосов
/ 15 мая 2009

Что означают термины «связанный с ЦП» и «связанный с вводом / выводом»?

Ответы [ 9 ]

365 голосов
/ 15 мая 2009

Это довольно интуитивно понятно:

Программа привязана к ЦП, если она будет работать быстрее, если бы ЦП был быстрее, т. Е. Она тратит большую часть своего времени просто на использование ЦП (выполнение вычислений). Программа, которая вычисляет новые цифры & pi; как правило, будет привязан к процессору, это просто хрустящие числа.

Программа привязана к вводу / выводу, если она будет работать быстрее, если подсистема ввода / вывода будет быстрее. Какая именно система ввода / вывода подразумевается, может варьироваться; Я обычно ассоциирую это с диском, но, конечно, сеть или общение в целом тоже распространены. Программа, которая просматривает огромный файл для некоторых данных, может стать связанной с вводом / выводом, поскольку узким местом является чтение данных с диска (на самом деле, этот пример, возможно, является старомодным в наши дни с сотнями МБ / с из SSD).

203 голосов
/ 15 мая 2009

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

I / O Bound означает, что скорость, с которой происходит процесс, ограничена скоростью подсистемы ввода-вывода. Задача, которая обрабатывает данные с диска, например, подсчет количества строк в файле, скорее всего, связана с вводом / выводом.

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

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

Ограничение ввода-вывода будет медленнее, чем ограничение памяти, будет медленнее, чем ограничение кэша будет медленнее, чем ограничение ЦП.

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

34 голосов

Многопоточность

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

Пример, связанный с вводом / выводом в ОЗУ: Векторная сумма

Рассмотрим программу, которая суммирует все значения одного вектора:

#define SIZE 1000000000
unsigned int is[SIZE];
unsigned int sum = 0;
size_t i = 0;
for (i = 0; i < SIZE; i++)
    /* Each one of those requires a RAM access! */
    sum += is[i]

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

Например, на моем Ubuntu 19.04 ноутбук Lenovo ThinkPad P51 с процессором: ЦП Intel Core i7-7820HQ (4 ядра / 8 потоков), ОЗУ: 2x Samsung M471A2K43BB1-CRC (2x 16 ГБ). Я получаю такие результаты:

enter image description here

График данных .

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

Код эталона:

Я не знаю достаточно компьютерной архитектуры, чтобы полностью объяснить форму кривой, но ясно одно: вычисления не становятся в 8 раз быстрее, чем наивно ожидалось из-за того, что я использовал все свои 8 потоков! По какой-то причине 2/3 потока было оптимальным, а добавление большего просто замедляет процесс.

Сравните это с работой с привязкой к процессору, которая на самом деле становится в 8 раз быстрее: Что означают 'real', 'user' и 'sys' в выводе времени (1)?

Причина, по которой все процессоры используют одну шину памяти, соединяющуюся с ОЗУ:

CPU 1   --\    Bus    +-----+
CPU 2   ---\__________| RAM |
...     ---/          +-----+
CPU N   --/

так что шина памяти быстро становится узким местом, а не процессором.

Это происходит потому, что добавление двух чисел занимает один цикл ЦП, чтение памяти занимает около 100 циклов ЦП в аппаратном обеспечении 2016 года.

Таким образом, процессорная работа, выполняемая для байта входных данных, слишком мала, и мы называем это процессом, связанным с вводом-выводом.

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

Обновление, например, до более быстрой тактовой частоты процессора не очень полезно.

Другие примеры

  • матричное умножение ограничено ЦП для ОЗУ и графических процессоров. Вход содержит:

    2 * N**2
    

    номеров, но:

    N ** 3
    

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

    Вот почему существуют параллельные библиотеки умножения матриц ЦП, подобные следующим:

    Использование кэша сильно влияет на скорость реализации. См. Например, пример сравнения дидактического графического процессора .

  • У графических процессоров есть узкое место при передаче данных в ЦП.

    Они спроектированы таким образом, что выходные данные рендеринга (прямоугольник пикселей) могут быть выведены непосредственно в видеопамять, чтобы избежать циклического обращения ЦП.

  • Сеть является прототипом примера IO.

    Даже когда мы отправляем один байт данных, для достижения цели все равно требуется много времени.

    Распараллеливание небольших сетевых запросов, таких как HTTP-запросы, может значительно повысить производительность.

    Если сеть уже работает на полную мощность (например, загружается торрент), распараллеливание может все еще увеличить увеличение задержки (например, вы можете загрузить веб-страницу «одновременно»).

  • фиктивная связанная с ЦП операция C ++, которая принимает одно число и много его хрустит:

Как узнать, связаны ли вы с процессором или IO

IO не в ОЗУ привязан как диск, сеть: ps aux, затем theck, если CPU% / 100 < n threads. Если да, вы связаны с IO, например, блоки read просто ждут данных, и планировщик пропускает этот процесс. Затем используйте дополнительные инструменты, такие как sudo iotop, чтобы решить, какой именно IO является проблемой.

Или, если выполнение быстрое и вы параметризовали количество потоков, вы можете легко увидеть из time, что производительность увеличивается с увеличением количества потоков для работы с привязкой к ЦП: Что означает «реальный» 'user' и 'sys' означают в выводе времени (1)?

Ограничение RAM-IO: трудно сказать, поскольку время ожидания RAM включено в измерения CPU%. Возможно, лучшее, что вы можете сделать, это оценить ошибки в кеше.

Смотри также:

CPython Global Intepreter Lock (GIL)

В качестве краткого примера я хочу указать на глобальную блокировку интерпретатора Python (GIL): Что такое глобальная блокировка интерпретатора (GIL) в CPython?

Эта деталь реализации CPython не позволяет нескольким потокам Python эффективно использовать работу, связанную с процессором. Документы CPython говорят:

Детали реализации CPython: В CPython из-за Глобальной блокировки интерпретатора только один поток может выполнить код Python одновременно (даже если некоторые ориентированные на производительность библиотеки могут преодолеть это ограничение). Если вы хотите, чтобы ваше приложение лучше использовало вычислительные ресурсы многоядерных машин, рекомендуется использовать multiprocessing или concurrent.futures.ProcessPoolExecutor. Тем не менее, многопоточность по-прежнему является подходящей моделью, если вы хотите запускать несколько задач, связанных с вводом / выводом одновременно.

Следовательно, здесь у нас есть пример, в котором содержимое с привязкой к ЦП не подходит, а ограничение ввода / вывода равно.

28 голосов
/ 15 мая 2009

Ограничение ЦП означает, что программа является узким местом ЦП или центральным процессором, в то время как Ограничение ввода / вывода означает, что программа узко ограничена вводом / выводом или вводом / выводом, таким как чтение или запись на диск, сеть и т. д.

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

[Под «узким местом» я подразумеваю то, что заставляет вашу программу работать медленнее, чем в противном случае.]

16 голосов
/ 15 мая 2009

Еще один способ выразить ту же идею:

  • Если ускорение ЦП не ускоряет вашу программу, оно может быть ограничено I / O .

  • Если ускорение ввода-вывода (например, с использованием более быстрого диска) не помогает, возможно, ваша программа связана с ЦП.

(Я использовал «может быть», потому что вам нужно учитывать другие ресурсы. Память - один из примеров.)

9 голосов
/ 15 мая 2009

Когда ваша программа ожидает I / O (т. Е. Чтение / запись на диск или чтение / запись по сети и т. Д.), Процессор может выполнять другие задачи, даже если ваша программа остановлена. Скорость вашей программы будет в основном зависеть от того, насколько быстро может произойти ввод-вывод, и если вы хотите ускорить ее, вам потребуется ускорить ввод-вывод.

Если ваша программа выполняет много программных инструкций и не ожидает ввода-вывода, то она называется связанной с процессором. Ускорение работы процессора ускорит работу программы.

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

5 голосов
/ 20 февраля 2013

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

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

4 голосов
/ 02 мая 2014

Процессы, связанные с вводом-выводом: тратите больше времени на выполнение ввода-вывода, чем на вычисления, их много короткие всплески процессора. Процессы, связанные с процессором: тратить больше времени на вычисления, несколько очень длинных циклов процессора

0 голосов
/ 12 апреля 2012

Связанный процесс ввода / вывода: - Если большая часть времени жизни процесса проводится в состоянии ввода / вывода, то этот процесс является процессом, связанным с вводом / выводом. Пример: -calculator, internet explorer

Процесс, связанный с процессором: - Если большая часть времени жизни процесса проводится в процессоре, то это процесс, связанный с процессором.

...