Что такое воровство работы?

click fraud protection

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

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

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

Преимущества и недостатки

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

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

Реализации

Некоторые языки программирования имеют среды выполнения, которые могут планировать работу непосредственно на выделенных процессорах. Например, это могут сделать язык программирования Cilk, среда выполнения Rust Tokio и библиотека параллельных задач .Net. В качестве альтернативы операционная система может отвечать за планирование фактического процессорного времени. Программа просто добавляет задачи в пул «рабочих потоков», которые сами планируются операционной системой.

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

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

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

Вывод

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