Сейчас на форуме: tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› Не полная загрузка процессора
Посл.ответ Сообщение

Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 29 февраля 2008 22:30
· Личное сообщение · #1

Здравствуйте!

Есть программулина. Написана на дельфях. Есть 2 ядерный процессор.
Программулина выполняет достаточно емкие и обьёмные задачи. При выполнении программы процессор максим загружаеться на 50%. При этом остальная часть ресурсов бездействует. Можно ли как-то использовать все ресурсы процессора?

Заранее всем огромное спасибо!

-----
моя подпись!





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 29 февраля 2008 22:44
· Личное сообщение · #2

Просто в проге 1 поток, и он по-переменно испоняется на каждом порце. В результате 50%.



Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 29 февраля 2008 22:50
· Личное сообщение · #3

s0larian пишет:
Просто в проге 1 поток, и он по-переменно испоняется на каждом порце. В результате 50%.

т.е. выход только в создании многопоточности? А выхлоп будет? Намного увеличиться скорость?

-----
моя подпись!




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 29 февраля 2008 22:58
· Личное сообщение · #4

Используй RealTime -приоритет, т.к. писать под многоядерные/многопроцессорные платформы никто не хочет.

-----
продавец резиновых утёнков





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 01 марта 2008 00:00 · Поправил: s0larian
· Личное сообщение · #5

locker_fx, ессно выход только в дополнительных потоках. Есть есть несколько ядер, то для их использования надо несколько потоков (или процессов). У NT/XP операционок unit of scheduling это поток. Если у тебя простая задача типа brute force, то распараллелив вычисления на два потока ты получишь прирост производительности в два раза. Ессно не всё так просто в других задачах, т.к. будут потери времени на синхронизацию/сообщения/события/сигналы.

Про процессы - иногда проще написать маленький manager запускающий несколько процессов с кусками задачи. В этом случае не надо реализовывать потоки/сихронизацию.




Ранг: 95.2 (постоянный), 26thx
Активность: 0.060
Статус: Участник

Создано: 01 марта 2008 03:34
· Личное сообщение · #6

юзай SSE



Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 01 марта 2008 09:50
· Личное сообщение · #7

s0larian пишет:
locker_fx, ессно выход только в дополнительных потоках. Есть есть несколько ядер, то для их использования надо несколько потоков (или процессов). У NT/XP операционок unit of scheduling это поток. Если у тебя простая задача типа brute force, то распараллелив вычисления на два потока ты получишь прирост производительности в два раза. Ессно не всё так просто в других задачах, т.к. будут потери времени на синхронизацию/сообщения/события/сигналы.

Про процессы - иногда проще написать маленький manager запускающий несколько процессов с кусками задачи. В этом случае не надо реализовывать потоки/сихронизацию.


Моя задача не юрут форс. НО ращделить на несколько независимых частей можно. К примеру есть 6(может быть чуть больше, а может чуть меньше) частей, на которые можно разделить для параллельной обработки. Как лучше сделать: создать 6 потоков(в каждом обрабатывать свой кусок) или 2 потока (в каждом обработать по 3 части) ?

-----
моя подпись!





Ранг: 279.1 (наставник)
Активность: 0.160
Статус: Участник
wizard

Создано: 01 марта 2008 09:59
· Личное сообщение · #8

HiEndsoft пишет:
Используй RealTime -приоритет, т.к. писать под многоядерные/многопроцессорные платформы никто не хочет.


procedure TForm1.FormCreate(Sender: TObject);
begin
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
end;

-----
Что один человек сделал , другой всегда сломать может...




Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 01 марта 2008 11:32 · Поправил: S_T_A_S_
· Личное сообщение · #9

Воспользуйся логикой. Если 6 сущностей предназначены для пераллельного выполнения, то запускай их в отдельных потоках, прочитав про синхронизацию у Рихтера. Только не занимайся ерундой вроде рилтайм приоритетов, если нет желания провесить систему.



Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 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?

-----
моя подпись!




Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 01 марта 2008 14:23
· Личное сообщение · #11

Сейчас 2 ядра, завтра 4, опять переписывать? Оверхед от переключения контекстов практически не зависит от того, сколько тредов в твоём процессе - в системе их и так еще несколько сотен. Гдавное не создавать и не уничтожать треды постоянно - это дорогая операция в винде.

Есть, конечно, случати, когда следует следовать более сложным правилам: не стоит создавать сотни тредов; стевой софт; профайлер показывает постоянные промахи кеша из-за вытеснения данных одного треда другим.

Если хочешь вручную планировать выполнение 6ти задач в 2х тредах, то сделай тогда без хардкода этих цифр. То есть что бы количество тредов можно было менять, погоняй с разными значениями и найди оптимальное (скорее всего, вычислять исходя из количества ядер)




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 01 марта 2008 19:38
· Личное сообщение · #12

S_T_A_S_ очень правильно всё говорит. Добавлю лишь что тебе надо написать абстракцию потоков и задач и потом изменить главную часть проги что б она закидывала эти задачи. Потом посмотришь как себя ведёт прога на 1/2х/4х процессорной системе с pool-ом из 1го/2х/3х/4х/10ти потоков.




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 02 марта 2008 10:25
· Личное сообщение · #13

s0larian пишет:
locker_fx, ессно выход только в дополнительных потоках. Есть есть несколько ядер, то для их использования надо несколько потоков (или процессов).


Нет никакой гарантии что два потока будут выполняться на разных ядрах, а не на одном ;)

-----
have a nice day





Ранг: 279.1 (наставник)
Активность: 0.160
Статус: Участник
wizard

Создано: 02 марта 2008 11:03
· Личное сообщение · #14

locker_fx пишет:
Попробовал, разницы не заметил.


Ну значит установка более высокого приоритета в твоём случае не канает.

Nimnul пишет:
Нет никакой гарантии что два потока будут выполняться на разных ядрах, а не на одном ;)


Практика покажет ,у меня к сожалению железо старое ,так что услышу ответ от других испытателях.

-----
Что один человек сделал , другой всегда сломать может...




Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 02 марта 2008 11:39
· Личное сообщение · #15

Гарантии есть в MSDN: The SetThreadAffinityMask function sets a processor affinity mask for the specified thread. Хотя SetThreadIdealProcessor может оказаться лучше.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 04 марта 2008 02:25
· Личное сообщение · #16

Nimnul пишет:
Нет никакой гарантии что два потока будут выполняться на разных ядрах, а не на одном ;)

Статистически, поток поподает на процессор с вероятностью примерно 50%. Удвоим кол-во потоков, и удвоим загрузку. Опять же, статистически, наши два потока кушают большцю часть времени, и scheduler сможет закинуть второй поток на второй проц когда перывй занят. Гарантии нету, это ж не RTOS, но статискика близка к теории.


 eXeL@B —› Программирование —› Не полная загрузка процессора
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати