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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2009, 22:48   #31
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Распараллелить можно независимые или частично независимые операции (группы операций). Например в одном потоке посчитать 2^10000, в другом 3^10000.
В вашем случае при подсчете 2^30999989:
для того чтобы вычислить 2^(i), необходимо знать 2^(i-1). (2^(i) = 2^(i-1) * 2)
для вычисления 2^(i-1) нужно знать 2^(i-2) и так далее.
Т.е. это расчеты для одного потока. Второму просто нечего делать, для его работы, в данном случае, не хватает данных.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 03.07.2009, 17:30   #32
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

А если, допустим, цикл с умножением массива на 2, разбить на 2 потока? Первый поток умножает первые 500000 цифр, второй остальные 500000 цифр, которые в массиве хранятся. Просто во втором потоке поменьше будет цифр и он будет немого простаивать, то есть будут небольшие паузы. Как вы думаете такое можно реализовать, и будет ли от этого хотя бы небольшая польза? И можно ли запускать потоки с частотой меньше 10 миллисекунд. Или процессор "с ума" сойдет?
Iong вне форума Ответить с цитированием
Старый 03.07.2009, 18:40   #33
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

процессор выполняет миллиарды операций в секунду...
но чтоб докопатся в отдельные тики нужно использовать АСМ
а вообще...попробывать ваш вариант можно...поидее на многоядерном проце польза будет...а вот на одно ядерном...врятли
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.07.2009, 18:46   #34
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Если хочешь дать программе одно ядро, то запрети через диспетчер задачь всем программам использовать одно из ядер, а этой разреши (но запрети испоьзовать первое).
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 03.07.2009, 23:13   #35
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
А если, допустим, цикл с умножением массива на 2, разбить на 2 потока? Первый поток умножает первые 500000 цифр, второй остальные 500000 цифр
Глобально распараллелить не получиться, но, вы правы, можно распараллелить выполнение отдельной операции: умножения.

Т.е. есть глобальный массив (длинное число) и переменная, хранящая текущее количество знаков этого числа. По ней определяем (разделив на 2) сколько знаков будет умножать первый, а сколько второй поток.
Далее в потоках происходит умножение на 2. Важно не потерять перенос, который возможен при вычислении младшей части числа. Также необходима синхронизация потоков, после каждой итерации умножения.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 04.07.2009, 06:55   #36
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Ну вот дело осталось за малым- реализовать это в программных кодах

вот моя попытка реализации, скажите что не правильно:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

     function tf:dword;
       function tf2:dword;

var
  Form1: TForm1;

  massiv:array[1..12000000] of shortint; // массив для хранения простого числа
  i,k:integer; // i-счетчик k-колличество чисел в массиве
  s,q:longint; // s-степень q-точки сохранения
  st,st1:string; // переменные для хранения заголовка файла и для сохранения числа в файл
  f,de:textfile; // переменные файлового типа

tid:Cardinal; th,th2:THandle; e,w:longint;
implementation

{$R *.dfm}

function tf;
var we:DWORD;
begin
i:=0;
repeat
GetExitCodeThread(th,we);
i:=i+1;
massiv[i]:=massiv[i]*2;
until e=i;
end;

function tf2;
var we:DWORD;
begin
i:=e;
repeat
GetExitCodeThread(th,we);
i:=i+1;
massiv[i]:=massiv[i]*2;
until  i=w;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
//обнуление массива
for i:=1 to 12000000 do
begin
massiv[i]:=0;
end;
q:=10000;
//загрузка
Assignfile(de,'chislo.doc');
{$I-}
Reset(de);
{$I+}
k:=0;
read(de,s);
While Not Eof(de) do
begin
k:=k+1;
read(de,massiv[k]);
end;
closefile(de);

//обработка числа
repeat
repeat
e:=trunc(k/2);
w:=k-e;
th:=CreateThread(0,0,@tf,0,CREATE_NEW,tid);
th2:=CreateThread(0,0,@tf2,0,CREATE_NEW,tid);
if massiv[k]>9 then k:=k+1;
i:=0;
repeat
i:=i+1;
if massiv[i]>9 then begin massiv[i]:=massiv[i]-10; massiv[i+1]:=massiv[i+1]+1; end;
until k=i;
s:=s+1;
form1.Caption:=inttostr(s);
until (s>=q)or(s=30999989);

//сохранение
if (s=q)or(s=30999989) then
begin
i:=1;
st:=inttostr(s)+'.doc';
AssignFile(f,st);
{$I-}
Append(f);
Rewrite(f);
st1:=inttostr(s)+' ';
write(f,st1);
repeat
st1:=inttostr(massiv[i])+' ';
write(f,st1);
i:=i+1;
until k=i-1;
closefile(f);
end;
q:=q+5000;
until s=30999989;
form1.caption:='Обсчет завершен!!!';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//загрузка
Assignfile(de,'chislo.doc');
{$I-}
Reset(de);
{$I+}
i:=0;
read(de,s);
While Not Eof(de) do
begin
i:=i+1;
read(de,massiv[i]);
end;
closefile(de);

//сохранение
AssignFile(f,'chislo.doc');
{$I-}
Append(f);
Rewrite(f);
i:=i-1;
repeat
write(f,massiv[i]);
i:=i-1;
until i=0;
closefile(f);
form1.Caption:='поворот завершен!';
end;

end.
для того что бы вы могли запустить эту программу у себя, создайте в папке с программой с помощью текстового документа файл 'chislo.doc' в файле напишите следующий текст '5 6 1'. у меня код компилируется и запускается, но через некоторое время сильно замедляется обработка и вылетает с ошибкой access violation. не пойму в чем причина. help me.

From Stilet: Код оформляй по кнопке #

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

Проблема в том, что вы создаете потоки, но не уничтожаете их.
Скажите, что за значения вы считываете из файла?
Зачем постоянно создавать потоки, их можно приостанавливать на время.
+ нет синхронизации.
+ еще несколько недочетов.

Я переделаю, выложу исправленную версию.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 05.07.2009 в 20:57.
Daramant вне форума Ответить с цитированием
Старый 05.07.2009, 23:03   #38
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Я считываю числа из файла которые состоят из одной цифры. Эти сохранения и загрузки сделаны для того что бы в случае непредвиденного прерывания программы, обработанные данные не терялись. А так как на такой объем обработки нужны месяцы работы компьютера поэтому приходится прерывать обработку. Ну и соответственно для этого я и сделал загрузку и сохранение.
Iong вне форума Ответить с цитированием
Старый 06.07.2009, 15:03   #39
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

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

Уважаемый Daramant спасибо большое. Я понимаю что вы крутой программист, но я то "нуб":-). Могли бы Вы объяснить что значит каждая строка в этой программе, я ничего не пойму. Если можно построчно "разжевать" код. Чтоб я со спокойной душой его усвоил.
Iong вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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