Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2009, 10:53   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

поправте если я не прав, но...
один поток=одно ядро
значит многопоточное нужно приложение
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.06.2009, 11:15   #12
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

Цитата:
имеет 2 цикла "репит" и штук 5 условий.
Для того, чтобы вычисления выполнялись на разных ядрах необходимо, чтобы данные которые обрабатываются на этих ядрах были между собой не зависимы, иначе одному ядру придется ждать результатов работы другого. Если это условие не выполняетса, то система считает, что эффективнее использовать одно ядро. И как переубедить ее в этом я не знаю.
Всякое безобразие должно быть единообразным. Тогда это называется порядком.
Anatole вне форума Ответить с цитированием
Старый 30.06.2009, 11:30   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
И как переубедить ее в этом я не знаю.
Можно попробовать распараллелить этот процесс, допустим в первом потоке главный цикл будет отрабатывать от 1 до N а во втором от N+1 до М. И каждому потоку дать найвысший приоритет.
Кстати хотелось бы узнать что это за задача такая которая обязательно требует полной загрузки? И как написана.

P.S. Для справки - если организовать поток с неким циклом в котором не поставить задержку его приоритет будет 100%, так что автор - распарраллеливайте задачу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.06.2009, 13:08   #14
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Конечно необходимо распараллеливание, если хотите загрузить все процессоры и получить результат за меньшее время.
Есть соответствующие библиотеки, например mpi (но, есть и другие).
P.S. Таким образом можно задействовать не только ядра одной машины, но и все доступные машины.
Распараллеливание более сложная вещь, здесь требуются соответствующие знания (я не говорю о распараллеливании цикла).
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 30.06.2009, 17:14   #15
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Вай. Люди, ну помогите же.
Iong вне форума Ответить с цитированием
Старый 30.06.2009, 17:21   #16
goblinyara
Форумчанин
 
Аватар для goblinyara
 
Регистрация: 02.01.2009
Сообщений: 340
По умолчанию

Iong, вам же сказали - используйте несколько потоков....
DelphiWorld 6. Скачай, поставь, и будет тебе счастье=)
Программирование, как и любовь -- одно слово, за которым скрывается бесконечное множество занятий.
goblinyara вне форума Ответить с цитированием
Старый 30.06.2009, 17:23   #17
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Такс. Я же студент. Делитант, и ничего не понимаю в вашем разпаралеливании.
Ну а если просто сказать про алгоритм моей программы. То она имеет массив, этот массив представляет одно большое число, а каждый элемен массива это одна цифра этого числа. И моя прога умножает это число на 2. Короче я ищу число: 2 в 31000000 степени. И вот прикиньте какая нужна мощь что бы это сделать.
Кстати, я подумал, можно один цикл разпаралелить(приблизительно получится еще 20-30 процентов к скорости обработки), только я не знаю как это сделать.
Если можно приведите хоть бы просто пример в командах и с описанием.

Как сделать несколько потоков?

Последний раз редактировалось Stilet; 01.07.2009 в 08:38.
Iong вне форума Ответить с цитированием
Старый 30.06.2009, 17:28   #18
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

В данном случае - для 2-х процессоров: можно в разных потоках посчитать 2 в 15500000 (31000000 / 2), а затем перемножить результаты.
P.S. Про реализацию потоков поищи на форуме, уже обсуждалось не раз.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 30.06.2009 в 17:33.
Daramant вне форума Ответить с цитированием
Старый 30.06.2009, 18:51   #19
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Поищу. Спасибо за помощь. Натолкнули на идею.
Iong вне форума Ответить с цитированием
Старый 01.07.2009, 08:45   #20
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Iong
У меня проц - Кора Дуба. Вот после такого кода оба ядра ядренно загрузились на 100% (Аш винамп погас )

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
    function tf:dword;
       function tf2:dword;
var  tid:Cardinal; th,th2:THandle; q,w:Extended;
  Form1: TForm1;

implementation


{$R *.dfm}
 // Раз поток
 //********** FUNCTION **********
 function tf;
 var i:DWORD;
 begin
 repeat
    GetExitCodeThread(th,i);
    q:=q+0.0001;
    form1.Caption:=floattostr(q)+' '+floattostr(w);
    //sleep(100)
 until  i=11;
 form1.caption:='Âñå';
 end;
 //********** END FUNCTION ******  {}
// два поток
  //********** FUNCTION **********
 function tf2;
 var i:DWORD;
 begin
 repeat
    GetExitCodeThread(th,i);
        w:=w+0.0001;
//    form1.Caption:=floattostr(w);
    //sleep(100)
 until  i=11;
 form1.caption:='Âñå';
 end;
 //********** END FUNCTION ******  {}


procedure TForm1.FormCreate(Sender: TObject);
begin
th:=CreateThread(0,0,@tf,0,CREATE_NEW,tid);
th2:=CreateThread(0,0,@tf2,0,CREATE_NEW,tid);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TerminateThread(th,11);
TerminateThread(th2,11);
end;

end.
Думаю разберешся, но тут бы неплохо немного код подкорректировать, он не соблюдает все условия безопасности (несинхронизирован)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код игры на Паскале и на Делфи сильно отличается? Как переписать код с Паскаля в Делфи? Mclaren Помощь студентам 2 27.04.2009 22:37
готовое приложение ComeToDaddy Помощь студентам 17 03.04.2009 18:25
консольное приложение user_jasser Общие вопросы Delphi 3 17.10.2008 12:17
Консольное приложение a_priori Общие вопросы Delphi 6 12.03.2008 08:33
Пароль на приложение Chals Общие вопросы Delphi 6 24.11.2007 21:32