Что означают термины "граница процессора" и "граница ввода-вывода"?

Что означают термины "привязка к процессору" и "привязка ввода/вывода"?

Ответ 1

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

Программа связана с CPU, если она будет работать быстрее, если процессор будет быстрее, т.е. Большую часть своего времени он проводит просто с использованием CPU (делая вычисления). Программа, которая вычисляет новые цифры π, обычно будет привязана к процессору, она просто хрустет.

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

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

#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 раз быстрее: Что делает & # 39; реальный & # 39 ;, & # 39; пользователь & # 39; и & # 39; sys & # 39; значит в выходных данных времени (1)?

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

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

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

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

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

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

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

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

  • Умножение матриц связано с использованием ЦП и ОЗУ. Вход содержит:

    2 * N**2
    

    числа, но:

    N ** 3
    

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

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

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

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

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

  • Сеть - это прототип IO-связанного примера.

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

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

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

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

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

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

Или, если выполнение выполняется быстро и вы параметризуете количество потоков, вы можете легко увидеть из time, что производительность увеличивается с увеличением количества потоков для работы с привязкой к ЦП: Что делает & # 39; реальным & # 39? ;, & # 39; пользователь & # 39; и & # 39; sys & # 39; значит в выходных данных времени (1)?

Ограничение RAM-IO: сложнее сказать, так как время ожидания RAM включено в измерения CPU%, см. также:

Некоторые варианты:

  • Intel Advisor Roofline (несвободный): https://software.intel.com/en-us/articles/intel-advisor-roofline (архив) "Диаграмма Roofline - это визуальное представление производительности приложений с учетом аппаратных ограничений, включая пропускную способность памяти и пики вычислений."

CPython Global Intepreter Lock (GIL)

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

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

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

Таким образом, здесь у нас есть пример, когда содержимое, связанное с процессором, не подходит, а ограничение ввода-вывода.

Ответ 4

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

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

[И под "узким местом", я имею в виду то, что делает вашу программу медленнее, чем в противном случае.]

Ответ 5

Другой способ сформулировать ту же идею:

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

I/O Связанный процесс: - Если большая часть времени жизни процесса расходуется в состоянии i/o, тогда процесс является процессом, связанным с i/o. Например: -calculator, Internet explorer

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