LINUX.ORG.RU

програмимрование для многоядерных процессоров


0

1

всем здравствуйте.
сразу говорю яндекс и гугл юзал.
интересует вопрос программирования для процессоров с несколькими ядрами.
из того что нашел в яндексе выяснил что с одной стороны программа должна быть написана для работы с несколькими ядрами (то есть часть вычислений в программе должна выполняться параллельно), с другой стороны ОС сама может распределять нагрузку на ядра(одна программа работает на одном ядре, вторая на другом ядре и они друг другу не мешают).
вопросы:
1) что значит написать программу для работы на нескольких ядрах? например на Перле функция fork() это из этой области или тут что то другое?
2) если программа написана для работы на многоядерном процессоре и ОС регулирует эту работу назначая каждой программе определённое ядро, как эти две вещи работают вместе?
3) как обстоят дела с многоядерными процессорами в FreeBSD и Linux?

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

★★★★★

1),3) Для начала можно почитать Танненбаума и Стивенса.

2) У Стивенса подробно описано, как отдельные потоки могут взаимодействовать между собой (всякие там блокировки, shm, mmap, сигналы, очереди сообщений и т.п.)

3) Лучше, чем у других :)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Таненбаум Э. «Архитектура компьютера» и Стивенс У. «UNIX: взаимодействие процессов» эти книги?

TDrive ★★★★★
() автор топика
Ответ на: комментарий от TDrive

+ Э. Танненбаум «Архитектура операционных систем», ну и про его MINIX почитать можно.

Eddy_Em ☆☆☆☆☆
()

по простому (не претендую на объективность): запускаются потоки, в некоторые кванты времени ядро обрабатывает сразу все, а в основном перемешивает как ему вздумается вместе с другими задачами в системе.

jeuta ★★★★
()
Ответ на: комментарий от jeuta

в ссылке просто меняйте l-server1 еденичку на 2..8

jeuta ★★★★
()
Ответ на: комментарий от jeuta

ничего не понял)
например ядра 2 (для конкретике Intel Core i3-370M)
если программа написана для работы с одним ядром то она и будет выполняться на одном ядре. что бы задействовать 2 ядра то нужно:
-написать программу для работы с 2 ядрами и задействованы будут оба ядра
-с помощью ОС одну программу повесить на одно ядро, другую повесить на другое ядро. нагрузка будет не равномерная но программы не будут друг другу мешать.
-если программа написана для 2 ядер и ОС назначает ядра то нужно читать книгу Танненбаума.

я правильно понимаю?

TDrive ★★★★★
() автор топика
Ответ на: комментарий от TDrive

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

мыслите об этом как о потоках. в программе вы можете создавать их сколько угодно. а ядро ОС (linux например) будет раскидывать их по имеющимся ядрам просессора (вперемешку со всем остальным в системе)

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

jeuta ★★★★
()
Ответ на: комментарий от jeuta

>https://www.ibm.com/developerworks/ru/library/l-server1/

цикл статей от IBM DW (пару раз бывал на главной)


ну вот там и используют pid = fork(); чтоб разделить программу на несколько процессов. такое я и на Perl писал.
этого достаточно что бы программа при работе использовала несколько ядер?

TDrive ★★★★★
() автор топика
Ответ на: комментарий от TDrive

там ещё семь статей (меняйте номер в ссылке)

читайте дальше. и желательно не по диагонали.

jeuta ★★★★
()
Ответ на: комментарий от jeuta

я кажется начинаю догонять.
ОС самостоятельно раскидывает потоки по ядрам в зависимости от нагрузки (в перемешку с потоками других программ) а задача программиста просто распределить вычисления в программе на потоки?

TDrive ★★★★★
() автор топика

Если тебе надо что-то большое вычислять - посмотри в сторону OpenMP. На ней числодробилки хорошо пишутся.
Если в аказемических целях, то Танненбаума и Стивенса тебе уже посоветовали.

trex6 ★★★★★
()

Посмотри еще, например, «Многоядерное программирование» Робертса & Эхтера http://www.piter.com/book.phtml?978538800091, там разжевано какие грабли многопоточности учитывать при программировании для процов одноядерных/многоядерных/многоядерных с гипертредингом и почему многопоточные предположения для одних процов несправедливы для других. Разобраны случаи с примерами для pthreads, OpenMP, MPI. Даны всякие рекомендации по предпочтениям тех или иных фреймворков.

slackwarrior ★★★★★
()

А что тогда есть OpenMP? Понимаю что это библиотека для распараллеливания по процам, но как? если параллелит ОС, а задача приложения просто потоков настрогать... или как?

xterro ★★★★★
()
Ответ на: комментарий от xterro

Я глубоко в OpenMP не погружался. Но на примитивном уровне позволяет в обычном С коде расставить директивы препроцессора, например перед циклами, чтоб цикл выполнялся не итеративно, а параллельно.
MPI - это средстов взаимодействия между процессами на разных процессорах. Скорее подходит для проргаммирования кластеров и т.п., чем для рапараллеливания в рамках одного процессора и несокльких ядер.

trex6 ★★★★★
()

что значит написать программу для работы на нескольких ядрах?

создаешь два потока в программе, в обоих бесконечные циклы, если в htop видно висят два ядра - значит написал для многоядерного процессора =)))

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от xterro

> А что тогда есть OpenMP? Понимаю что это библиотека для распараллеливания по процам, но как? если параллелит ОС, а задача приложения просто потоков настрогать... или как?

Это расширения C для возможности использования data parallelism, в директивах можно указывать каким образом вешать треды на процессоры и сколько их будет.

anonymous
()
Ответ на: комментарий от trex6

> Если тебе надо что-то большое вычислять - посмотри в сторону OpenMP. На ней числодробилки хорошо пишутся. Если в аказемических целях, то Танненбаума и Стивенса тебе уже посоветовали.

Сильно зависит от задачи, если у нас функциональный параллелизм, то надо использовать MPI, если по данным, то OpenMP. Это из самых известных решений для сей.

anonymous
()
Ответ на: комментарий от jeuta

> по простому (не претендую на объективность): запускаются потоки, в некоторые кванты времени ядро обрабатывает сразу все, а в основном перемешивает как ему вздумается вместе с другими задачами в системе.

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

anonymous
()
Ответ на: комментарий от anonymous

Чо значит «скатился»? Сам Дональд великий Кнут признавался, что не понимает вообще никак параллельного программирования. Тоже мне блин, гуры тут выискались, пальцы веером.

anonymous
()
Ответ на: комментарий от TDrive

таки да, в простых случаях достаточно грамотно форкаться

gadfly ★★
()
Ответ на: комментарий от anonymous

> Чо значит «скатился»? Сам Дональд великий Кнут признавался, что не понимает вообще никак параллельного программирования. Тоже мне блин, гуры тут выискались, пальцы веером.

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

anonymous
()
Ответ на: комментарий от anonymous

Не понимаю только одного, а ОС как? ведь она рулит распределением потоков по ядрам, а тут какое-то «приложение с OpenMP» получается само рулит и делает что хочет, у меня это в голове не стыкуется :(

xterro ★★★★★
()
Ответ на: комментарий от xterro

> Не понимаю только одного, а ОС как? ведь она рулит распределением потоков по ядрам, а тут какое-то «приложение с OpenMP» получается само рулит и делает что хочет, у меня это в голове не стыкуется :(

google://processor affinity

anonymous
()
Ответ на: комментарий от anonymous

> Чо значит «скатился»? Сам Дональд великий Кнут признавался, что не понимает вообще никак параллельного программирования. Тоже мне блин, гуры тут выискались, пальцы веером.

старым людям тяжело воспринимать новое, ничего не поделаешь, нервные клетки не восстанавливаются

anonymous
()
Ответ на: комментарий от anonymous

>Сам Дональд великий Кнут признавался, что не понимает вообще никак параллельного программирования.

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

Тоже мне блин, гуры тут выискались, пальцы веером.


Да какие гуры, ответы на вопросы тут заданные можно нагуглить и освоить за полчаса. Человек должен научиться самостоятельно осваивать хотя бы то, что уже разжёвано сто раз в классических книжках.

anonymous
()
Ответ на: комментарий от anonymous

Теперь понятно, т.е библиотека рулит этим самым «processor affinity», подключая сколько надо процов(ядер). Стало понятней.

P.S. Тут мегавещь узнал, оказывается даже в WinXP можно рулить этим самым «processor affinity» и давать сколько надо процов(ядер) на выполнение процесса... :)

xterro ★★★★★
()

Всё просто: 2) ОС решает, какой поток на каком ядре будет выполнятся. Исходя из этого: 1) Программа должна быть многопоточной. А дальше ОС сама решит, какой поток на каком ядре должен выполнятся. 3) AFAIK ни в Linux, ни в FreeBSD с этим не возникает никаких проблем.

Deleted
()
Ответ на: комментарий от Deleted

всем большое спасибо за ответы)

TDrive ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.