2

Я новичок в многопоточном программировании. Я читал несколько статей, но два основных момента, о которых я не совсем уверен.Многопоточный код с одноядерным процессором и однопотоковым кодом с многоядерным процессором

  1. Если у меня есть однопоточный код (последовательный), и я запускаю его на многоядерном процессоре. Будет ли ОС пытаться делиться потоком на несколько потоков (при этом заботясь о зависимостях), чтобы воспользоваться процессором muli-core?
  2. Если у меня многопоточный код, и я запускаю его на одноядерном процессоре. Будет ли ОС делать разделить время между различными потоками (так же, как это происходит с несколькими процессами)?
+2

1. № 2. Да ........ –

+0

Я не понимаю, почему этот вопрос получил 4 upvotes? 4 человека с одинаковой домашней работой? –

+0

Поверьте мне, приятель. Не домашнее задание. – KhaledWas

ответ

3

1) Нет

Если приложение использует, например, в математике библиотеки Intel и скомпилировано с правильными переключателями, процедуры, такие как FFT, будут во время выполнения будут выделены в отдельные потоки соответствующих количество ядер в машине. Исходный код остается «однопоточным», но библиотека создает и уничтожает потоки за спиной.

Аналогичным образом некоторые компиляторы (например, Intel icc, компилятор Sun's C) могут превращать некоторые циклы в отдельные потоки, каждый из которых выполняет роль итераций. Снова исходный код выглядит однопоточным, но компилятор генерирует многопоточный код от вашего имени. Это немного похоже на автоматическое применение OpenMP к исходному коду.

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

Библиотеки и трюки компилятора, подобные этому, были разработаны таким образом, чтобы программисты могли извлекать более высокую производительность из «единого» потока кода. Intel начала добавлять подобные функции в свою библиотеку математики примерно в то же самое время, когда они начали направлять на многоядерные процессоры. Идея заключалась в том, чтобы создать (с точки зрения программиста) впечатление лучшего «одного» потока производительности, в то время как скорость фактически была доставлена ​​несколькими ядрами. Аналогично Sun, когда они начали делать многопроцессорные компьютеры.

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

2) Да. Как еще он это сделает?

+0

Спасибо за ответ. Таким образом, в одном случае один поток может каким-то образом быть преобразован в несколько потоков, как вы упомянули. Но это не операционная система, а библиотеки и компиляторы. – KhaledWas

+0

@KhaledWas Правильно.В моем ответе я не упоминал инфраструктуру ввода/вывода - есть много сложных способов, с помощью которых операции ввода-вывода могут обрабатываться отдельными потоками, но потоки немного скрыты от точки зрения программиста. Такие вещи, как Node.JS, делают это, async i/o в .NET и т. Д. – bazza

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

  2. Да, например, планировщик Linux does not even distinguish between threads and processes.