Многопоточность против многопроцессорности с массивным процессором - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть код c, который я хочу работать так же быстро, как я могу на Windows

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

Каждый номер независим от других чисел.

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

Что я делаю сейчас, например, мне нужно работать в диапазоне 0-1000, и у меня есть 10 ядер, я создаю 10 процессов из моего кода c и разделяю работу между ними.

Процесс1 работает в диапазоне 0-100, процесс2 работает в диапазоне 100-200 и т. Д.

Мы знаем, что нужно разделить каждый процесс на отдельное ядро ​​(потому что каждый процесс использует много процессора), поэтому, когда я смотрю на диспетчер задач, все мои ядра используются на 100%.

Таким образом, каждый процесс выполняется как 5 часов (поэтому время выделения незначительно)

Если я создам поток для каждого ядра (а не процесс для каждого ядра), я знаю, что ОС будет знать, как разделить поток на ядра, это будет быстрее?

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

Возможно, много процессов замедляют работу ОС против потока в 1 процессе

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

простое объяснение: https://www.techopedia.com/definition/24297/multithreading-computer-architecture

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

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

Операционные системы используют многопоточность двумя способами:

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

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

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

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

Чтобы ответить на вопрос, бежать как можно быстрее

  • вы НЕ хотите запускать несколько экземпляров исполняемого файла, конечно, не в Windows
  • Я не знаю, как в Windows, но в Linux есть то, что известно как Сродство к процессору , которое будет привязывать данный поток к определенному ядру на весь срок службы потока, иначе операционная система Linux может перебросить его на разные ядра ... так как Linux считает, что он управляет всем происходящим настолько эффективно, насколько это возможно; это не тот случай, когда цель состоит в том, чтобы запустить только ваш код как можно быстрее, так как накладные расходы переносят потоки на разные ядра ЦП
  • вы хотели бы перепрограммировать ваш код C, используя OpenMP или PTH , известные как pthreads. Openmp - это язык более высокого уровня, использующий директивы в C и обрабатываемый компилятором C, и делает параллельное программирование относительно простым. PTH - более тонкое программирование, и для него может быть сложнее учиться и писать код, но использование PTH может позволить вам написать код, который будет работать быстрее всего. Обсуждается ли параллельное программирование в PTH быстрее, чем OpenMP, и, на мой взгляд, очень зависит от алгоритма, который вы пытаетесь реализовать.
  • и в зависимости от вашего алгоритма самый быстрый способ может быть с ядрами графического процессора, использующими CUDA, при условии, что у вас есть видеокарта NVidia. Я полагаю, что карты ATI / AMD могут теперь делать нечто подобное, но я не знаю их терминологию.
  • также многопроцессорность в основном для приложений или для выполнения совершенно отдельных программ одновременно; многопоточность - это меньше многоплановых задач одной и той же программы или процесса, с меньшими накладными расходами и будет быстрее, чем вы хотите; посмотрите разницу между многопроцессорностью и многопоточностью. Межпроцессное взаимодействие требует значительных ресурсов, и в вашем случае его следует избегать, не создавайте несколько процессов.
0 голосов
/ 08 ноября 2018

Если я создам поток для каждого ядра (не процесс для каждого ядра), я знаю, что ОС будет знать, чтобы отделить поток от ядер, это будет быстрее?

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

Для такой проблемы вам, вероятно, будет лучше найти способы оптимизации циклов обработки (например, вы можете использовать инструкции SSE или найти более эффективный алгоритм?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...