0 / 0 / 0
Регистрация: 01.02.2018
Сообщений: 9

Как сделать так, чтобы программа на free pascal или ее часть выполнялась на всех ядрах и потоках?

13.08.2018, 23:35. Показов 2371. Ответов 6

Студворк — интернет-сервис помощи студентам
Как сделать так, чтобы программа на free pascal или ее часть выполнялась на всех ядрах и потоках?
Чтобы пошустрее работала.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.08.2018, 23:35
Ответы с готовыми решениями:

Как сделать так, чтобы определённая часть кода выполнялась только в случае выполнения заданного условия?
Как сделать так чтобы элемент кода выполнялся после выполнения условия? Мне нужно сделать чтобы при правильном вводе "пароля"...

Как сделать так, чтобы программа копировала часть текста из консоли?
привет. как сделать так, чтобы программа копировала часть текста из консоли и через некоторое время она могла бы его вставить...

Как сделать так, чтобы проверка foreach выполнялась только среди слов с данным ключом
Как сделать так, чтобы проверка foreach выполнялась только среди слов с данным значением, а не во всем контейнере? namespace...

6
Эксперт Pascal/Delphi
2388 / 1300 / 1492
Регистрация: 29.08.2014
Сообщений: 4,665
14.08.2018, 09:13
http://wiki.freepascal.org/Mul... n_Tutorial

Добавлено через 2 часа 13 минут
вот еще пример глупая сортировка двух массивов подряд и в 2-х потоках:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
uses
  sysutils {$ifdef unix}, cthreads{$endif} ;
 
type
   Parr=^TArr;
   Tarr=array of integer;
 
var
 t:TTimeStamp;
 a,a1,a2:TArr;
 i:longint;
 ff:integer;
 
function fsort2(p:pointer):ptrint;
var
  i:longint;
  t:integer;
  a:Tarr;
begin
  pointer(a):=p;
  writeln('fsort started');
  i:=0;
  while (i<High(a)) do begin
    if a[i+1]<a[i] then begin
      t:=a[i];
      a[i]:=a[i+1];
      a[i+1]:=t;
      i:=0;
    end else  i:=i+1;
  end;
    p:=@a;
    pointer(a):=nil;
    fsort2:=0;
    ff:=ff+1;
    writeln('fsort finished');
 
end;
 
procedure CopyArr(a:TArr;var b:TArr);
var
  i:longint;
begin
  setlength(b,length(a));
  for i:=0 to High(a) do b[i]:=a[i];
end;
 
procedure PrintArr(a:TArr;c:integer);
var
  i:longint;
begin
  for i:=0 to High(a) do if (i>0) and (i mod c=0) then writeln(a[i]) else write(a[i]);
end;
 
begin
  randomize;
  setlength(a,3000);
  for i:=0 to High(a) do a[i]:=Random(10);
  CopyArr(a,a1);
  CopyArr(a,a2);
//  PrintArr(a,40);
  t:=DateTimeToTimeStamp(Now);
  fsort2(pointer(a1));
  fsort2(pointer(a2));
  writeln('ms passed:',DateTimeToTimeStamp(Now).Time-t.Time);
//  PrintArr(a1,40);
  writeln('Threads:');
  CopyArr(a,a1);
  CopyArr(a,a2);
  t:=DateTimeToTimeStamp(Now);
  ff:=0;
  BeginThread(@fsort2,pointer(a1));
  BeginThread(@fsort2,pointer(a2));
  while ff<2 do ;
  writeln('ms passed:',DateTimeToTimeStamp(Now).Time-t.Time);
//  PrintArr(a3,40);
  readln;
end.
PS: на windows не проверял
1
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,847
16.09.2018, 05:50
Teran69
Начни например с потоков ) ядра вообще как бы не трогай, тут вопрос уже если ты привязан к железу, если, но FPC более свободен, чем даже C++
даю тебе пример, как я юзаю потоки, чтобы общаться с COM устройством:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
type
  TComThread = class (TThread)
    private
      var
      protocol_pause:byte;
      protocol_pause2:byte;
      protocol_repeat:byte;
      hPort:THandle;
      DCB:TDCB;
      OverWrite, OverRead:TOverlapped;
      Stat : TComStat;
      last_pack:byte;
 
      //sbuf:string;
      RBuffer:array [0..$ffff-1] of byte;
      rbuflen:dword;
 
     type
      tt_pack = array of byte;
     var
      t_pack:array of tt_pack;
 
      procedure Read();
      procedure WriteP(S:array of byte);
 
      procedure refresh_bath_start;
 
     var
 
      readflag:boolean;
      update_bath_count:byte;
 
    public
 
      BathState:array[1..16] of TBathState;
 
      constructor Create(const cn:byte; baudrate:dword; stopbits,databits:byte; parity, flowcontrol:boolean );
      procedure SetProtocolSettings(const p_pause,p_pause2,p_repeat:byte);
      destructor Free();
 
      procedure SetParams(num:byte; mode,mode2,zhem_levelset, t23,t1:byte);
      procedure Start(num:byte);
      procedure Stop(num:byte);
      procedure parse;
      procedure testpack;
     var
       port_exist:boolean;
    protected
      procedure Execute(); override;
  end;
 
implementation
 
procedure TComThread.refresh_bath_start;
var i:byte;
begin
  update_bath_count:=0;
  for i:=1 to 16 do BathState[i].updated:=false;
end;
 
procedure TComThread.WriteP(S:array of byte);
var dwWrite,i, t1, t2:dword;
begin
  OverWrite.hEvent := CreateEvent(nil, True, False, nil);
  if OverWrite.hEvent = Null then
  raise Exception.Create('Error creating write event');
  if (not WriteFile(hPort, s, sizeof(s),  dwWrite, @OverWrite))
 and (GetLastError <> ERROR_IO_PENDING) then
  raise Exception.Create('Error writing port');
 
end;
 
constructor TComThread.Create(const cn:byte; baudrate:dword; stopbits,databits:byte; parity, flowcontrol:boolean );
var i:byte;
 
begin
 
  hPort:=CreateFile(PChar('//./COM'+IntToStr(cn)),generic_read or generic_write, 0, nil,
                  open_existing, file_flag_overlapped,0);
  port_exist:=GetLastError=0;
  if port_exist then
  begin
  GetCommState(hPort,DCB);
  Dcb.BaudRate :=baudrate;
  Dcb.Parity := NOPARITY;
  Dcb.ByteSize := databits;
  Dcb.StopBits := ONESTOPBIT;
  DCB.Flags:=20625;
  SetCommState(hPort,DCB);
  SetupComm(hPort,16,16);
  PurgeComm(hPort,Purge_TxAbort or Purge_rxabort or Purge_Txclear or purge_rxclear);
  Sleep(100);
 
  SetLength(t_pack,16,5);
 
  for i:=0 to 15 do begin t_pack[i][0]:=$ff; t_pack[i][1]:=$40+i+1; end;
 
  for i:=1 to 16 do BathState[i].started_procedure:=false;
{  t_pack[1]:=$41;   // <<4 num
  t_pack[2]:=$81;   // <<KZ S1    команда, жемчуг, галочки
  t_pack[3]:=$48;   // <<T2 T3    температура
  t_pack[4]:=$15;   // <<S2 T1    галочки, температура}
 
  FreeOnTerminate:=True;
  end;
  inherited Create(False);
end;
 
procedure TComThread.SetProtocolSettings(const p_pause,p_pause2,p_repeat:byte);
begin
  protocol_pause:=p_pause;
  protocol_pause2:=p_pause2;
  protocol_repeat:=p_repeat;
end;
 
procedure TComThread.Read();
var errs,kols:dword;
begin
// REsive:='';
  if port_exist then
  begin
 OverRead.hEvent := CreateEvent(nil, True, False, nil);
 if OverRead.hEvent = Null then
  raise Exception.Create('Error creating read event');
 
 begin
  if not ClearCommError(hPort, Errs, @Stat) then
   raise Exception.Create('Error clearing port');
 
 
  Kols := Stat.cbInQue;
  rbuflen:=Kols;
//  SetLength(Rbuffer,Kols);
  if Kols > 0 then
  begin
       ReadFile(hPort, RBuffer, Kols, Kols, @OverRead)
  end;
 end;
  end;
end;
 
destructor TComThread.Free();
begin
   CloseHandle(hPort);
end;
 
procedure TComThread.testpack;
var t:array of byte;
begin
 WriteP(t_pack[last_pack]);
end;
 
procedure TComThread.Stop(num:byte);
begin
 if port_exist then
 begin
 while not readflag do;
 readflag:=true;
// t_pack[1]:=$40+num;
  last_pack:=num-1;
 t_pack[num-1][2]:=(1<<7) + (t_pack[num-1][2] and $3f);
 testpack;
{ Read();
 Parse();}
 readflag:=false;
{ Sleep(pause);}
 
 end;
end;
 
procedure TComThread.SetParams(num:byte; mode,mode2,zhem_levelset, t23,t1:byte);
var i:byte;
begin
 if port_exist then
 begin
  while not readflag do;
  readflag:=true;
//  t_pack[1]:=$40+num;
  last_pack:=num-1;
  t_pack[num-1][2]:=(t_pack[num-1][2] and $c0)+(zhem_levelset<<4)+mode;
  t_pack[num-1][3]:=t23;
  t_pack[num-1][4]:=(mode2<<4)+t1;
 
  for i:=1 to protocol_repeat do
  begin
    testpack;
    Sleep(protocol_pause2);
  end;
 
  readflag:=false;
 end;
end;
 
procedure TComThread.Start(num:byte);
begin
 while not readflag do;
 readflag:=true;
 //t_pack[1]:=$40+num;
 last_pack:=num-1;
 t_pack[num-1][2]:=(1<<6)+ (t_pack[num-1][2] and $3f);
 testpack;
 {Read();
 Parse();
 Sleep(pause);}
 readflag:=false;
end;
идея в том, что ты можешь сделать кучу экземпляров этого класса, где каждый создаст свой поток
0
445 / 373 / 133
Регистрация: 09.09.2011
Сообщений: 1,344
17.09.2018, 23:06
Если программа расчетная, то надо будет алгоритм менять, можно руками треды не дергать, а обойтись оберткой - MTProcs. Работает нормально.

http://wiki.freepascal.org/Parallel_procedures
0
0 / 0 / 0
Регистрация: 17.05.2022
Сообщений: 2
03.01.2026, 13:22
Сделал всё как в учебнике. Потоки работают только в одном ядре. Паскаль банально определяет компьютер как одноядерный. Подскажите пожалуйста, что с этим можно сделать?

Работаю в Debian GNU/Linux 12 (bookworm).

http://wiki.freepascal.org/Parallel_procedures
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
03.01.2026, 13:45
Это program Test;, которая приведена по ссылке? Debian 13 (trixie), запустил, изменив с 5 потоков на 50 (чтобы заметить активность), все ядра задействованы. Или было написано какое-то другое приложение? Тогда нужен код...
0
0 / 0 / 0
Регистрация: 17.05.2022
Сообщений: 2
04.01.2026, 12:24
Тестовая программа у меня тоже запустилась на всех ядрах...

Добавлено через 1 час 16 минут
Всё работает. Это я запутался. Просто данные для распараллеливаемой функции подготавливаются достаточно долго. И это я видел работу одного ядра именно при подготовке данных. А когда программа добралась до функции, то всё заработало.

Спасибо огромное, разобрался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.01.2026, 12:24
Помогаю со студенческими работами здесь

Как сделать так чтобы функция не выполнялась до того момента когда она получит второй параметр
Как сделать так чтобы функция не выполнялась до того момента когда она получит второй параметр. Почемуто она у меня начинает выполнятся до...

Работа с SQLCLR - Сделать так, чтобы процедура выполнялась на сервере
Подскажите, вот у меня процедура на C#, которая берет указанную таблицу и что-то с ней делает. ConnectionString у меня там задан явным...

Как сделать, чтобы результат был на Free Pascal, с кода Ассемблера
Программисты, как сделать, чтобы результат был на Free Pascal, с кода Ассемблера? Вот код Результат будет в eax. mov ...

Сделать так, чтобы функция setbox выполнялась раз в некоторое время
Суть такова: пишу игру, в стиле гонок. Снизу - спрайт автомобиля, сверху сбрасываются блоки-&quot;препятствия&quot;. Их горизонтальная...

Вообще возможно сделать так чтобы команда system(); выполнялась в фоновом режиме?
Вообще возможно сделать так чтобы команда system(); выполнялась в фоновом режиме? есть команда system(&quot;start .\hl2.exe -game...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru