В последнее время развитие железа пошло в сторону многоядерности процессоров. Передо мной стала задача разработки приложения, которое могло бы использовать приемущества многоядености. Облазил много источников, где упонинаються различные среды разработки и библиотеки, но все они направлены на создание вычислительного кластера (сети), е. е. несколько ядер под управлением нескольких операционных систем. Мне же нужна среда или либа для создания приложения для многоядерной архитектуры под управлением одной ОС. Подозреваю что подобная задача не из легких, поскольку винда например сама менеджит несколько ядер, создавая для каждого по пулу потоков и разпределяя потоки между ядрами. Но возможно это можно как-то обойти...
Никакого принципиального различия между многоядерными процессорами и многопроцессорными системами на одноядерных процессорах нет.
Разница проявляется когда у вас несколько многоядерных процессоров (получается уже не SMP), но это вообще такие дебри, что до них ещё добраться надо...
Здравствуйте, maxcool, Вы писали:
M>В последнее время развитие железа пошло в сторону многоядерности процессоров. Передо мной стала задача разработки приложения, которое могло бы использовать приемущества многоядености. Облазил много источников, где упонинаються различные среды разработки и библиотеки, но все они направлены на создание вычислительного кластера (сети), е. е. несколько ядер под управлением нескольких операционных систем. Мне же нужна среда или либа для создания приложения для многоядерной архитектуры под управлением одной ОС. Подозреваю что подобная задача не из легких, поскольку винда например сама менеджит несколько ядер, создавая для каждого по пулу потоков и разпределяя потоки между ядрами. Но возможно это можно как-то обойти...
во первых надо алгоритм распараллелить, логику. и кинуть задачи разным потокам, например, в пулы (QueueUserWorkItem в винде)
а если же у тебя в алгоритме много долгоиграющих циклов, можешь смело взяться за OpenMP, ищи у интела на сайте
Здравствуйте, ilnar, Вы писали:
I>во первых надо алгоритм распараллелить, логику. и кинуть задачи разным потокам, например, в пулы (QueueUserWorkItem в винде) I>а если же у тебя в алгоритме много долгоиграющих циклов, можешь смело взяться за OpenMP, ищи у интела на сайте
А каким образом гарантировать, что потоки попадут в пулы к РАЗНЫМ ядрам, и будут выполняться буквально одновременно?
Здравствуйте, adontz, Вы писали:
A>Никакого принципиального различия между многоядерными процессорами и многопроцессорными системами на одноядерных процессорах нет.
Разница заключается в том, находятся ли эти ядра под управлением одной ОС или нескольких (по одной ОС на ядро). Если мы имеем вычислительную сеть (одно-два ядра на ОС) то для организации и распаралелливания вычислений в такой сети необходима специальная платформа (MPI или MC#).
A>Разница проявляется когда у вас несколько многоядерных процессоров (получается уже не SMP), но это вообще такие дебри, что до них ещё добраться надо...
A>А вообще где именно чешется?
Мне же чешется не вычислительная сеть, а обычный многоядерный компьютер с одной ОС. Меня интересует с использованием каких библиотек и сред разработки (желательно С/С++/С#) можно написать приложние, которое в полной мере использует для своих вычислений многоядерность архитектуры.
Здравствуйте, maxcool, Вы писали:
M>Разница заключается в том, находятся ли эти ядра под управлением одной ОС или нескольких (по одной ОС на ядро). Если мы имеем вычислительную сеть (одно-два ядра на ОС) то для организации и распаралелливания вычислений в такой сети необходима специальная платформа (MPI или MC#).
Я так понял речь об одной машине, разве нет?
M>Мне же чешется не вычислительная сеть, а обычный многоядерный компьютер с одной ОС. Меня интересует с использованием каких библиотек и сред разработки (желательно С/С++/С#) можно написать приложние, которое в полной мере использует для своих вычислений многоядерность архитектуры.
Чтобы примерно равномерно загрузить все ядра ничего особенного кроме возможности разделить задачу на независимые подзадачи по количеству ядер не требуется. Обычной библиотеки по управлению потоками и объектами синхронизации хватит.
Здравствуйте, maxcool, Вы писали:
M>Здравствуйте, ilnar, Вы писали:
I>>во первых надо алгоритм распараллелить, логику. и кинуть задачи разным потокам, например, в пулы (QueueUserWorkItem в винде) I>>а если же у тебя в алгоритме много долгоиграющих циклов, можешь смело взяться за OpenMP, ищи у интела на сайте
M>А каким образом гарантировать, что потоки попадут в пулы к РАЗНЫМ ядрам, и будут выполняться буквально одновременно?
это винапи функция QueueUserWorkItem гарантирует. там реализован умный алгоритм, который создает по крайней мере по потоку на ядро, и это пул потоков обрабатывают пул твоих мелких задач. не знаю, если система загружена, уменьшает ли количество потоков. а вот если задачи простые и менеджер пула потоков видит что процы мало заняты, добавит еще потоков.
Здравствуйте, maxcool, Вы писали: M>...Меня интересует с использованием каких библиотек и сред разработки (желательно С/С++/С#) можно написать приложние, которое в полной мере использует для своих вычислений многоядерность архитектуры.
Для .Net от Microsoft: CCR — Concurrency and Coordination Runtime (является частью <b>Microsoft Robotics Studio</b>, для коммерческого использования надо платить ) <b>Статья от Jeffrey Richter</b> <b>Channel9</b> <b>video</b> (В главной роли Jeffrey Richter )
Здравствуйте, maxcool, Вы писали:
I>>во первых надо алгоритм распараллелить, логику. и кинуть задачи разным потокам, например, в пулы (QueueUserWorkItem в винде) I>>а если же у тебя в алгоритме много долгоиграющих циклов, можешь смело взяться за OpenMP, ищи у интела на сайте
M>А каким образом гарантировать, что потоки попадут в пулы к РАЗНЫМ ядрам, и будут выполняться буквально одновременно?
Оставь это ОС. Она сама разберется какой поток на каком ядре выполнять. Планировщик потоков не дураки писали...
Но все же если СИЛЬНО хочется то читай про affinity mask.
Здравствуйте, maxcool, Вы писали:
M>Мне же чешется не вычислительная сеть, а обычный многоядерный компьютер с одной ОС. Меня интересует с использованием каких библиотек и сред разработки (желательно С/С++/С#) можно написать приложние, которое в полной мере использует для своих вычислений многоядерность архитектуры.
Посмотри на мой проект act-o. Еще есть блог, где я, в том числе, пишу о вопросах, связанных с параллельностью. Если будут вопросы, пиши. Мои контакты можно найти в профиле блога.
Re: Несколько ядер...
От:
Аноним
Дата:
10.09.07 11:43
Оценка:
Здравствуйте, maxcool, Вы писали:
Мне же нужна среда или либа для создания приложения для многоядерной архитектуры под управлением одной ОС.
Воспользуйся языком MC# (www.mcsharp.net).
В этой системе программирования имеется автоматический балансировщик
нагрузки (потоков) на процессоры/ядра системы.
При порождении нового потока он помещается на наименее загруженное ядро
в данный момент.