0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
|
1 | |
Билдер и 4 ядра17.03.2012, 23:02. Показов 4774. Ответов 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 ядра? Что будет лучше i7 2630qm (2 Гц 4 ядра) vs i5 3230m (2,6 Гц 2 ядра) ? |
1565 / 1491 / 248
Регистрация: 19.02.2010
Сообщений: 4,047
|
|
17.03.2012, 23:18 | 2 |
Нет, в Билдере ограничений не стоит.
Надо "вручную" запрограммировать распределение вычислений на несколько потоков. Курите либо класс TThread, либо виндовозовские апишные функции (CreateThread() и прочие).
0
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
17.03.2012, 23:19 | 3 |
Подозрение правильное, но билдер не причем.
Производить вычисление сразу в несколько потоков, для чего написать соответствующий код. Луше приэто заюзать какую-нибудь либу, которая это дело облегчит.
0
|
17.03.2012, 23:23 | 4 |
TThread лучше наверное в нем синхронизация с компонентами реализована.
Как я понимаю если приложение однопоточно то выполняется оно с одинаково независимо от кол-ва ядер(тобиш выигрыша 0) И не факт что программу можно "разложить" на потоки.
0
|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
|
17.03.2012, 23:33 [ТС] | 5 |
Потоки, значит...
Спасибо, попробую. Вроде должно получиться: у меня там массив объектов, и каждый объект вычисляется независимо. Значит, первым делом стоит TThread попробовать?
0
|
36 / 36 / 8
Регистрация: 10.11.2011
Сообщений: 94
|
||||||
18.03.2012, 12:24 | 7 | |||||
увеличивать процессорное время выделяемое программе
код есть на Delphi, проблем переписать на С++ не составит
0
|
Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
|
|
18.03.2012, 13:00 | 8 |
Если ищешь более легкий путь, то советую использовать технологию MPI, которая как раз и создана для распараллеливания вычислительноемких задач. По сложности изучения, что MPI, что потоки примерно одинаковы, но вот использовать MPI гораздо проще и приятнее. К тому же, можно распараллеливать и на несколько компов. Если заинтересовало, то советую Реализация MPICH2 - http://parallel.ru/vvv/mpi.html
0
|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
|
19.03.2012, 22:49 [ТС] | 9 |
Всем спасибо за советы. Я использовал TThread и получил полную загрузку. Это оказалось не сложно, так что библиотеки использовать видимо не буду.
А вот совет ББК, которому я последовал в первую очередь, не помог, что не удивительно: если в программе явно не расписана многопоточность, то воспользоваться дополнительными процессорами она не может, какой ты ей приоритет ни поставь. darkAngel, а упомянутые тобой примитивы синхронизации для чего используются? Про них у Архангельского не было упомянуто, поэтому я сделал по-простому: 4 потока, в каждом обрабатываю 1/4 массива объектов, а пятый, главный, поток следит, чтоб эти 4 потока выполнились, и тогда переходит к следующему циклу.
0
|
19.03.2012, 23:11 | 10 |
У Архангельского несколько книг в одной он TThread описывает и там есть о возможности этого класса синхронизировать доступ потоков к vcl- компонентам В другой книге (более продвинутой) дается описание WinApi -ф-ции и объектов синхронизации доступа к ресурсам (мютексы,семафоры,события и тп) Самое скверное это то что без синхронизации прога поначалу может работать нормально, но в непредвиденных ситуациях напрочь заглючивать.
0
|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
|
20.03.2012, 16:24 [ТС] | 11 |
Avazart, а как называется эта "более продвинутая" книга?
Я сначала распараллелил независимое вычисление объектов, и всё работало нормально. Но потом распараллелил взаимодействие объектов, при котором они обращаются к полям друг друга, и всё стало зависать в произвольный момент времени. Похоже, надо разбираться в семафорах и прочем.
0
|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
|||||||||||
21.03.2012, 20:03 [ТС] | 14 | ||||||||||
Чё-та не нашёл я этой книги. Ссылочку не подкинешь?
Хотя, мне кажется, что я исправил ситуацию. К сожалению, пришёл к решению интуитивно, а не в результате понимания ситуации. Может кто подскажет, почему всё зависало? А дело вот в чём. Мне казалось, что зависания эти происходят вовсе не из-за обращения к одному и тому же ресурсу. Потому что во-первых, данные читались, а не записывались, а во-вторых, зависания происходили либо с самого начала (после единиц циклов), либо в конце, когда популяция обсчитываемых объектов значительно уменьшалась. В остальное время всё отлично работало, а значит потоки не конфликтовали при чтении данных. И случайно я нашёл решение. Мне надо было понизить приоритет главного потока, чтоб цикл ожидания не мешал дочерним потокам считать объекты. И вдруг оказалось, что если поставить главному потоку минимальный приоритет, программа виснет сразу и в 100% случаев. А если дать ему максимальный приоритет, то программа не виснет. А было всё вот как организовано (опишу в псевдокоде):
И, собственно, вот как я поменял процедуру главного потока:
0
|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
||||||
22.03.2012, 17:59 [ТС] | 17 | |||||
вот:
переменная "с" становится ложью если все потоки засуспенжены
Кстати, после упомянутого мною в предыдущем посте нововведения с приоритетами, ситуация таки возникает, но никогда вначале, а только в том случае, когда число объектов становится небольшим, порядка десяти штук. Сейчас я просто добавил таймер, который суспендит незасуспендившийся поток по прошествии некоторого интервала. Но всё же хотелось бы понять причину ситуации и нейтрализовать её. Avazart Ладно, я у Шилдта нашёл эту тему.
0
|
22.03.2012, 20:11 | 18 | |||||
Zolden этот цикл грузил основной поток.
Попробуй так (пример использования объекта события):
0
|
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 11
|
||||||
23.03.2012, 19:40 [ТС] | 19 | |||||
kzru_hunter
Спасибо за код, кое-что новое для себя узнал. Я попробовал реализовать твой вариант, но он работал на порядок медленней варианта с TThread. Видимо, потому, что мне на каждой итерации главного потока надо было заново создавать массив дочерних потоков, а потом удалять. А это медленно. Впрочем, не уверен. Но было реально медлденно, по сравнению с вариантом с TThread, когда я приостанавливал-возобновлял потоки вместо их создания на каждом цикле. Поэтому я просто заменил свой вариант ожидания на предложенную тобой функцию WaitForSingleObject(). И снова программа начала виснуть: возникает ситуация, когда ни один из потоков не выполняется, но WaitForSingleObject не получает события продолжить работу. Ума не приложу, в чём дело. Так что, уже простите, приведу полный код двух моих классов, наследующих TThread, в надежде, что кто-то подскажет, что у меня с ними может быть не так. Вдруг тут есть акая-то очевидная ошибка, которую я, в силу неопытности, не замечаю.
0
|
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,064
|
|
23.03.2012, 19:48 | 20 |
В переплете я купил на ozon.ru.
0
|
23.03.2012, 19:48 | |
23.03.2012, 19:48 | |
Помогаю со студенческими работами здесь
20
Что выбрать? 2 ядра 3100 Мгц или 4 ядра 1100 Мгц Конструкторы С++ Билдер Задача по Си Билдер Портативный С++ Билдер Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |