|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
|
Билдер и 4 ядра17.03.2012, 23:02. Показов 5012. Ответов 26
Метки нет (Все метки)
У меня 4-х ядерный процессор, и я использую CodeGear C++ Builder 11.
Приложение, над которым я работаю, вычислительноёмкое, и я хотел бы использовать процессор по максимуму. Но когда открываю Windows Task Manager, вижу, что потребляется лишь 25% процессорного времени. Есть подозрение, что задействуется только одно ядро, хотя может быть просто в билдере стоит ограничение. Вопрос: как сделать так, чтоб использовалось 90% процессора?
0
|
|
| 17.03.2012, 23:02 | |
|
Ответы с готовыми решениями:
26
нетбук с каким процом лучше n550(2 ядра )или C-50(2 ядра )? Помогайте выбрать: видюха 640М и проц i7 2.4Гц (4 ядра) или 750M и i7 2Гц (2 ядра) ? Что выбрать: Intel 2 ядра или AMD 4 ядра? |
|
2649 / 1660 / 267
Регистрация: 19.02.2010
Сообщений: 4,392
|
|
| 17.03.2012, 23:18 | |
|
Нет, в Билдере ограничений не стоит.
Надо "вручную" запрограммировать распределение вычислений на несколько потоков. Курите либо класс TThread, либо виндовозовские апишные функции (CreateThread() и прочие).
0
|
|
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
|||
| 17.03.2012, 23:19 | |||
|
0
|
|||
|
|
|
| 17.03.2012, 23:23 | |
|
TThread лучше наверное в нем синхронизация с компонентами реализована.
Как я понимаю если приложение однопоточно то выполняется оно с одинаково независимо от кол-ва ядер(тобиш выигрыша 0) И не факт что программу можно "разложить" на потоки.
0
|
|
|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
|
| 17.03.2012, 23:33 [ТС] | |
|
Потоки, значит...
Спасибо, попробую. Вроде должно получиться: у меня там массив объектов, и каждый объект вычисляется независимо. Значит, первым делом стоит TThread попробовать?
0
|
|
|
36 / 36 / 8
Регистрация: 10.11.2011
Сообщений: 94
|
||||||
| 18.03.2012, 12:24 | ||||||
|
увеличивать процессорное время выделяемое программе
код есть на Delphi, проблем переписать на С++ не составит
0
|
||||||
|
Технофашист
229 / 217 / 11
Регистрация: 11.03.2009
Сообщений: 887
|
||
| 18.03.2012, 13:00 | ||
Если ищешь более легкий путь, то советую использовать технологию MPI, которая как раз и создана для распараллеливания вычислительноемких задач. По сложности изучения, что MPI, что потоки примерно одинаковы, но вот использовать MPI гораздо проще и приятнее. К тому же, можно распараллеливать и на несколько компов. Если заинтересовало, то советую Реализация MPICH2 - http://parallel.ru/vvv/mpi.html
0
|
||
|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
|
| 19.03.2012, 22:49 [ТС] | |
|
Всем спасибо за советы. Я использовал TThread и получил полную загрузку. Это оказалось не сложно, так что библиотеки использовать видимо не буду.
А вот совет ББК, которому я последовал в первую очередь, не помог, что не удивительно: если в программе явно не расписана многопоточность, то воспользоваться дополнительными процессорами она не может, какой ты ей приоритет ни поставь. darkAngel, а упомянутые тобой примитивы синхронизации для чего используются? Про них у Архангельского не было упомянуто, поэтому я сделал по-простому: 4 потока, в каждом обрабатываю 1/4 массива объектов, а пятый, главный, поток следит, чтоб эти 4 потока выполнились, и тогда переходит к следующему циклу.
0
|
|
|
|
||
| 19.03.2012, 23:11 | ||
У Архангельского несколько книг в одной он TThread описывает и там есть о возможности этого класса синхронизировать доступ потоков к vcl- компонентам В другой книге (более продвинутой) дается описание WinApi -ф-ции и объектов синхронизации доступа к ресурсам (мютексы,семафоры,события и тп) Самое скверное это то что без синхронизации прога поначалу может работать нормально, но в непредвиденных ситуациях напрочь заглючивать.
0
|
||
|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
|
| 20.03.2012, 16:24 [ТС] | |
|
Avazart, а как называется эта "более продвинутая" книга?
Я сначала распараллелил независимое вычисление объектов, и всё работало нормально. Но потом распараллелил взаимодействие объектов, при котором они обращаются к полям друг друга, и всё стало зависать в произвольный момент времени. Похоже, надо разбираться в семафорах и прочем.
0
|
|
|
|
||
| 20.03.2012, 19:18 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
||||||||||||
| 21.03.2012, 20:03 [ТС] | ||||||||||||
|
Хотя, мне кажется, что я исправил ситуацию. К сожалению, пришёл к решению интуитивно, а не в результате понимания ситуации. Может кто подскажет, почему всё зависало? А дело вот в чём. Мне казалось, что зависания эти происходят вовсе не из-за обращения к одному и тому же ресурсу. Потому что во-первых, данные читались, а не записывались, а во-вторых, зависания происходили либо с самого начала (после единиц циклов), либо в конце, когда популяция обсчитываемых объектов значительно уменьшалась. В остальное время всё отлично работало, а значит потоки не конфликтовали при чтении данных. И случайно я нашёл решение. Мне надо было понизить приоритет главного потока, чтоб цикл ожидания не мешал дочерним потокам считать объекты. И вдруг оказалось, что если поставить главному потоку минимальный приоритет, программа виснет сразу и в 100% случаев. А если дать ему максимальный приоритет, то программа не виснет. А было всё вот как организовано (опишу в псевдокоде):
И, собственно, вот как я поменял процедуру главного потока:
0
|
||||||||||||
|
|
|
| 22.03.2012, 17:14 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
|||||||
| 22.03.2012, 17:59 [ТС] | |||||||
|
переменная "с" становится ложью если все потоки засуспенжены
Кстати, после упомянутого мною в предыдущем посте нововведения с приоритетами, ситуация таки возникает, но никогда вначале, а только в том случае, когда число объектов становится небольшим, порядка десяти штук. Сейчас я просто добавил таймер, который суспендит незасуспендившийся поток по прошествии некоторого интервала. Но всё же хотелось бы понять причину ситуации и нейтрализовать её. Avazart Ладно, я у Шилдта нашёл эту тему.
0
|
|||||||
|
|
||||||
| 22.03.2012, 20:11 | ||||||
|
Zolden этот цикл грузил основной поток.
Попробуй так (пример использования объекта события):
0
|
||||||
|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
||||||
| 23.03.2012, 19:40 [ТС] | ||||||
|
kzru_hunter
Спасибо за код, кое-что новое для себя узнал. Я попробовал реализовать твой вариант, но он работал на порядок медленней варианта с TThread. Видимо, потому, что мне на каждой итерации главного потока надо было заново создавать массив дочерних потоков, а потом удалять. А это медленно. Впрочем, не уверен. Но было реально медлденно, по сравнению с вариантом с TThread, когда я приостанавливал-возобновлял потоки вместо их создания на каждом цикле. Поэтому я просто заменил свой вариант ожидания на предложенную тобой функцию WaitForSingleObject(). И снова программа начала виснуть: возникает ситуация, когда ни один из потоков не выполняется, но WaitForSingleObject не получает события продолжить работу. Ума не приложу, в чём дело. Так что, уже простите, приведу полный код двух моих классов, наследующих TThread, в надежде, что кто-то подскажет, что у меня с ними может быть не так. Вдруг тут есть акая-то очевидная ошибка, которую я, в силу неопытности, не замечаю.
0
|
||||||
|
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
|
||
| 23.03.2012, 19:48 | ||
|
0
|
||
| 23.03.2012, 19:48 | |
|
Помогаю со студенческими работами здесь
20
Что будет лучше i7 2630qm (2 Гц 4 ядра) vs i5 3230m (2,6 Гц 2 ядра) ?
Конструкторы С++ Билдер Задача по Си Билдер Портативный С++ Билдер Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений в EXE. Здесь описаны базовые шаги для старта программирования с помощью CMake. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|