3

Компьютер имеет 2 физических ядра и 4 логических ядра (например, компьютер с процессором i5-3210M).

Когда программа A запускается, htop показывает, что она использует 100% 1 ядра, а остальные 3 ядра почти бездействуют. Пропускная способность в этом случае X.

Мой вопрос: если я запускаю 4 экземпляра A на 4 логических ядрах, то общая пропускная способность будет 4X или 2X? Что делать, если я запускаю только два экземпляра?

3 ответа3

2

Даже с гораздо большим количеством ядер, чем задач, они не будут идеально масштабироваться. Это потому, что некоторые государства почти всегда разделяются. Не обязательно в задаче, но ядро, например. Или они могут получить доступ к одному и тому же ресурсу, например, к сети, к диску или к чему-либо еще.

SMT (т.е. Hyper-Threading) может опираться на тот факт, что разные задачи используют разные исполнительные блоки ЦП. Таким образом, так называемый «параллелизм на уровне команд» может быть достигнут на суперскалярных процессорах. Практически любой современный процессор x86 является суперскалярным.

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

Тем не менее, в большинстве случаев это не так, и происходят разные вещи. До тех пор, пока одна и та же команда не появляется в обоих потоках команд (примерно) одновременно, использование исполнительных блоков ЦП может быть улучшено.

1

Концепция ядер не так проста. Логические ядра - это количество физических ядер, умноженное на количество потоков, которые могут работать на каждом ядре. Это известно как HyperThreading. Если у меня есть компьютер с 4-ядерным процессором, на котором запущено два потока на ядро, то у меня 8 логических процессоров. Вы можете увидеть основные возможности вашего компьютера, запустив команду lscpu.

Если процессор имеет 4 ядра, но он может выполнять 8 потоков параллельно, это означает, что он имеет только 4 ядра (процессорные единицы). Но он может обеспечить аппаратную поддержку 8 потоков параллельно. Ясно, что в ядрах может работать максимум 4 задания. Одна работа выполняется в ядре, если каким-либо образом останавливается память или операция ввода / вывода, тогда другой поток может использовать это свободное ядро.

Теперь вы понимаете, что если ваш компьютер имеет 2 физических ядра и может выполнять 2 потока на ядро, то у вас есть 4 логических процессора. Таким образом, вы можете запустить только 2 экземпляра, так как у вас есть 2 физических ядра, это означает, что вы используете все возможности отдельных физических ядер (2 потока одновременно). Так что пропускная способность составит 50%. Но если в любое время один поток простаивает, то ядро может загрузить один поток на этом ядре.

Вы можете отключить HyperThreading в BIOS(что-то вроде « Intel ht technology ») и увидеть разницу между обычными и HyperThreading возможностями, так как теперь пропускная способность будет равна 100%.

0

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

пример:

Если у меня есть однопотоковая программа, которая вычисляет простые числа от 2 до 10, один запущенный экземпляр будет рассчитывать, если каждое число из 2-10 будет простым, и обнаружит, что 2,3,5,7 являются простыми.

Если я добавлю второй экземпляр без каких-либо изменений в код, то первый экземпляр будет рассчитывать, если каждое число из 2-10 является простым, и обнаружит, что 2,3,5,7 являются простыми, а второй экземпляр будет рассчитывать, если каждое число из 2-10 простые и найти, что 2,3,5,7 простые.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .