Сейчас на форуме: tyns777, zombi-vadim (+3 невидимых) |
![]() |
eXeL@B —› Программирование —› Не полная загрузка процессора |
Посл.ответ | Сообщение |
|
Создано: 29 февраля 2008 22:30 · Личное сообщение · #1 Здравствуйте! Есть программулина. Написана на дельфях. Есть 2 ядерный процессор. Программулина выполняет достаточно емкие и обьёмные задачи. При выполнении программы процессор максим загружаеться на 50%. При этом остальная часть ресурсов бездействует. Можно ли как-то использовать все ресурсы процессора? Заранее всем огромное спасибо! ----- моя подпись! ![]() |
|
Создано: 29 февраля 2008 22:44 · Личное сообщение · #2 |
|
Создано: 29 февраля 2008 22:50 · Личное сообщение · #3 |
|
Создано: 29 февраля 2008 22:58 · Личное сообщение · #4 |
|
Создано: 01 марта 2008 00:00 · Поправил: s0larian · Личное сообщение · #5 locker_fx, ессно выход только в дополнительных потоках. Есть есть несколько ядер, то для их использования надо несколько потоков (или процессов). У NT/XP операционок unit of scheduling это поток. Если у тебя простая задача типа brute force, то распараллелив вычисления на два потока ты получишь прирост производительности в два раза. Ессно не всё так просто в других задачах, т.к. будут потери времени на синхронизацию/сообщения/события/сигналы. Про процессы - иногда проще написать маленький manager запускающий несколько процессов с кусками задачи. В этом случае не надо реализовывать потоки/сихронизацию. ![]() |
|
Создано: 01 марта 2008 03:34 · Личное сообщение · #6 |
|
Создано: 01 марта 2008 09:50 · Личное сообщение · #7 s0larian пишет: locker_fx, ессно выход только в дополнительных потоках. Есть есть несколько ядер, то для их использования надо несколько потоков (или процессов). У NT/XP операционок unit of scheduling это поток. Если у тебя простая задача типа brute force, то распараллелив вычисления на два потока ты получишь прирост производительности в два раза. Ессно не всё так просто в других задачах, т.к. будут потери времени на синхронизацию/сообщения/события/сигналы. Про процессы - иногда проще написать маленький manager запускающий несколько процессов с кусками задачи. В этом случае не надо реализовывать потоки/сихронизацию. Моя задача не юрут форс. НО ращделить на несколько независимых частей можно. К примеру есть 6(может быть чуть больше, а может чуть меньше) частей, на которые можно разделить для параллельной обработки. Как лучше сделать: создать 6 потоков(в каждом обрабатывать свой кусок) или 2 потока (в каждом обработать по 3 части) ? ----- моя подпись! ![]() |
|
Создано: 01 марта 2008 09:59 · Личное сообщение · #8 HiEndsoft пишет: Используй RealTime -приоритет, т.к. писать под многоядерные/многопроцессорные платформы никто не хочет. procedure TForm1.FormCreate(Sender: TObject); begin SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); end; ----- Что один человек сделал , другой всегда сломать может... ![]() |
|
Создано: 01 марта 2008 11:32 · Поправил: S_T_A_S_ · Личное сообщение · #9 |
|
Создано: 01 марта 2008 12:57 · Личное сообщение · #10 MACKLIA пишет: procedure TForm1.FormCreate(Sender: TObject); begin SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); end; Попробовал, разницы не заметил. S_T_A_S_ пишет: Воспользуйся логикой. Если 6 сущностей предназначены для пераллельного выполнения, то запускай их в отдельных потоках, прочитав про синхронизацию у Рихтера. Только не занимайся ерундой вроде рилтайм приоритетов, если нет желания провесить систему. Вот как раз из-за соображений логики и спрашиваю: Смотри. Если я сделаю 6 потоков, то по логике выполняться все сразу на полную мощь они не смогут(по логике только 2 могу на полную мощь, 50% берёт один, а оставшиеся 50% заберёт другой). Но винда подумает, что выполнять надо все 6 параллельно, и имхо будут потери среди переключений между этими потоками. Или я не прав? Поэтому и спрашиваю, что лучше 6 потоков или 2? ----- моя подпись! ![]() |
|
Создано: 01 марта 2008 14:23 · Личное сообщение · #11 Сейчас 2 ядра, завтра 4, опять переписывать? Оверхед от переключения контекстов практически не зависит от того, сколько тредов в твоём процессе - в системе их и так еще несколько сотен. Гдавное не создавать и не уничтожать треды постоянно - это дорогая операция в винде. Есть, конечно, случати, когда следует следовать более сложным правилам: не стоит создавать сотни тредов; стевой софт; профайлер показывает постоянные промахи кеша из-за вытеснения данных одного треда другим. Если хочешь вручную планировать выполнение 6ти задач в 2х тредах, то сделай тогда без хардкода этих цифр. То есть что бы количество тредов можно было менять, погоняй с разными значениями и найди оптимальное (скорее всего, вычислять исходя из количества ядер) ![]() |
|
Создано: 01 марта 2008 19:38 · Личное сообщение · #12 |
|
Создано: 02 марта 2008 10:25 · Личное сообщение · #13 |
|
Создано: 02 марта 2008 11:03 · Личное сообщение · #14 locker_fx пишет: Попробовал, разницы не заметил. Ну значит установка более высокого приоритета в твоём случае не канает. Nimnul пишет: Нет никакой гарантии что два потока будут выполняться на разных ядрах, а не на одном ;) Практика покажет ,у меня к сожалению железо старое ![]() ----- Что один человек сделал , другой всегда сломать может... ![]() |
|
Создано: 02 марта 2008 11:39 · Личное сообщение · #15 |
|
Создано: 04 марта 2008 02:25 · Личное сообщение · #16 Nimnul пишет: Нет никакой гарантии что два потока будут выполняться на разных ядрах, а не на одном ;) Статистически, поток поподает на процессор с вероятностью примерно 50%. Удвоим кол-во потоков, и удвоим загрузку. Опять же, статистически, наши два потока кушают большцю часть времени, и scheduler сможет закинуть второй поток на второй проц когда перывй занят. Гарантии нету, это ж не RTOS, но статискика близка к теории. ![]() |
![]() |
eXeL@B —› Программирование —› Не полная загрузка процессора |