Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Выполнение программы на многоядерном процессоре  (Прочитано 14242 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
ezus
Опытный

il
Offline Offline

« : 25-11-2015 09:48 » 

Добрый день.

Аппликация на Сш вызывает для долгоиграющих вычислений DLL C++ от VS C++6.0.
DLL написана в односредовом варианте.
Если во время вычислений, которые происходят строго в памяти машины. При этом, если смотреть на таскменеджер, то он показывет загрузку нескольких ядер. Ну про один из них понятно - на нем бежит DLL.
А чем заняты другие? Бежит только эта аппликация.

Спасибо.
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 25-11-2015 13:45 » 

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

Больше информации можно получить, посмотрев использование ЦП процессами во время выполнения этой программы.
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 25-11-2015 16:54 » 

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

Не будите спашяго дракона.
             Джаффар (Коша)
ezus
Опытный

il
Offline Offline

« Ответ #3 : 26-11-2015 08:45 » 

То Dale
Я практически на 100% уверен, что никакие пользовательские процессы в это время не бегут. Да и таскменеджер это подтверждает. активность обоих ядер прекращается с завершением расчета.

То Finch
Да, это интересно. А какой в этом смысл?
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #4 : 26-11-2015 09:32 » 

То Finch
Да, это интересно. А какой в этом смысл?
Сорри, что вмешиваюсь - просто в большинстве ОС есть возможность задать, на каких процессорах будет выполняться процесс. Если ничего специально не задано, то выбор остаётся за системой.
Записан
ezus
Опытный

il
Offline Offline

« Ответ #5 : 26-11-2015 11:23 » 

То darkelf
Спрашивая о смысле, я имел ввиду вопрос:" Какой смысл переключать ядра между квантами времени, если это всего лишь один поток управления?"
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 26-11-2015 11:24 » 

активность обоих ядер прекращается с завершением расчета.

Как я понял, на Вашем компьютере 2 ядра? Тогда посмотрите в таскменеджере общую загрузку ЦП. Если не превышает 50%, то это единственный поток скачет по разным ядрам поочередно, как предположил Finch. Если больше, то параллельно выполняются асинхронные потоки, например, обслуживание сети, ввод/вывод, GUI (если есть) и т.п.
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #7 : 26-11-2015 13:31 » 

То darkelf
Спрашивая о смысле, я имел ввиду вопрос:" Какой смысл переключать ядра между квантами времени, если это всего лишь один поток управления?"
В современных ОС даже при минимальном количестве запущенных прикладных задач на выполнении одновременно находятся сотни потоков различных фоновых служб, системных драйверов и т.д. Ваша задача иногда прерывает своё выполнение выполняя системный вызов, например чтение файла с диска, или передачу данных по сети. В этот момент задача ставится в очередь блокированных в ядре ОС. После выполнения системного вызова так может оказаться, что процессор, на котором выполнялась Ваша задача уже занят выполнением другого потока, например какой-нибудь системной службы. А второй процессор в это время, допустим, свободен - вот ядро ОС может решить, что продолжить своё выполнение Ваша задача может на другом процессоре. Конечно в ядре ОС стараются минимизировать "миграцию" задач между процессорами, но это удаётся не всегда.
Записан
ezus
Опытный

il
Offline Offline

« Ответ #8 : 26-11-2015 14:57 » 

Спасибо всем.

Я похоже понял в чем дело.
У меня есть прородитель DLL - обычная программа На С++.
Если запускаешь вычисления обычной Сшной программы, то ОС выделяет ей одно ядро, и программа загружает ЦРУ на 50%, а второе ядру спит себе беспробудно.

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

Очевидно, когда DLL запускается из-под Сшарпом, .НЕТ платформа что-то делает. Вопрос ЧТО?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 26-11-2015 16:58 » 

Начнем с самого начала. Что .NET код работает на виртуальной машине. Еще на этой машине крутятся куча служебнвх потоков. Например Garbage collector.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
ezus
Опытный

il
Offline Offline

« Ответ #10 : 19-12-2015 19:38 » new

Все верно - параллельно с программой бежит еще много всяких процессов и потоков.
Не понятно почему они бегут только при выполнении алгоритма под .NET, а при исполнении того же алгоритма на той же машине только в виде сишной программы от VS c++6.0 занят только 1 подпроцессор, а второй 0%?
Если это Garbage collector, то что он чистит, занимая 80-90% второго ядра? Ведь в момент исполнения загружаемой ДДЛ с неуправляемым кодом активность виртуальной машины должна быть нулевой или минимальной.
« Последнее редактирование: 19-12-2015 19:44 от ezus » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines