Member
Статус: Не в сети Регистрация: 30.01.2009 Откуда: Брест, Москва
Многопоточность в Делфях загнала меня в ступор... В частности класс TThread... Перегуглил весь интернет, изучил массу материалов. Несколькими способами пытался реализовать многопоточность в проге и.... никакого эффекта. Прога представляет из себя бенчмарк на основе нейронных сетей. Одно ядро грузит на 100%, два - только на 50% (как я не старался только разбивать участки кода в отдельные потоки )... Необходимо: загрузить все имеющиеся ядра "на всю катушку". Ниже преведен пример однопоточной версии проги. Вся мат. часть бенча висит на событии BitBtn2Click. Помогите советом какие участки кода повыносить в отдельные потоки. Конструктивные предложения приветствуются Если у кого будет время и желание, можете доработать код... Все откликнувшиеся обязательно будут отмечены в разделе "Благодарности" финального релиза (планирую развивать проект)... Всем спасибо!
З.Ы: За "корявый" (пока ещё) код просьба строго не судить
procedure TForm1.BitBtn3Click(Sender: TObject); begin BitBtn3.Enabled := False; FCST_Images := Round(Max_images / 2); AssignFile(F_x_pr,'x_pr.dat'); AssignFile(F_y_pr,'y_pr.dat'); AssignFile(F_z_pr,'z_pr.dat'); {$I-} ReWrite(F_x_pr); ReWrite(F_y_pr); ReWrite(F_z_pr); {$I+} X_pr[1] := X_et[Max_images]; Y_pr[1] := Y_et[Max_images]; Z_pr[1] := Z_et[Max_images]; For i := 2 To FCST_Images Do Begin For j := 1 To Num_s Do Begin Sum[j] := W_in[1,j] * X_pr[i-1] + W_in[2,j] * Y_pr[i-1] + W_in[3,j] * Z_pr[i-1] - T1[j]; Y[j] := F(Sum[j]); End; X_out := 0; Y_out := 0; Z_out := 0; For j := 1 To Num_s Do Begin X_out := X_out + W_out[j,1] * Y[j]; Y_out := Y_out + W_out[j,2] * Y[j]; Z_out := Z_out + W_out[j,3] * Y[j]; End; X_out := X_out - T2[1]; Y_out := Y_out - T2[2]; Z_out := Z_out - T2[3]; X_pr[i] := X_out; Y_pr[i] := Y_out; Z_pr[i] := Z_out; End; For i := 1 To FCST_Images Do Begin WriteLN(F_x_pr,X_pr[i]); WriteLN(F_y_pr,Y_pr[i]); WriteLN(F_z_pr,Z_pr[i]); End; CloseFile(F_x_pr); CloseFile(F_y_pr); CloseFile(F_z_pr); BitBtn4.Enabled := True; end;
procedure TForm1.N3Click(Sender: TObject); var a : Word; begin a := MessageDlg('Вы действительно'+#13+'хотите выйти?',mtConfirmation,[mbYES,mbNO],0); If a = mrNO Then Exit; If a = mrYES Then Form1.Close; end;
procedure TForm1.BitBtn4Click(Sender: TObject); begin Form2.ShowModal; end;
procedure TForm1.N5Click(Sender: TObject); begin bench := True; Edit1.Text := '8000'; ЭТО СПАМ - ОТПРАВЬТЕ ЖАЛОБУ (синий квадрат); Edit2.Text := '0,01'; Edit3.Text := '0,001'; Edit4.Text := '100'; MessageDlg('Сейчас будет произведен тест системы.' + #13 + 'Не перемещайте мышь и не трогайте клавиатуру!',mtInformation,[mbOK],0); Form1.Update; ЭТО СПАМ - ОТПРАВЬТЕ ЖАЛОБУ (синий квадрат); end;
Junior
Статус: Не в сети Регистрация: 24.12.2008 Откуда: Москва
Слишком много кода... Наврядли кто-то сподобится вникать.Может быть, для начала стоит написать простейшую программу из трех потоков, один для юзер-интерфейса, два других считают какие-то простейшие функции f1 и f2?
Mulber писал(а):
Помогите советом какие участки кода повыносить в отдельные потоки.
Собственно совет прост - разнести юзер-интерфейс и счет в разные потоки. Ну и не забывать, что на двухядерном процессоре больше двух счетных потоков заводить в общем случае смысла нет.
MaximQWERTY Ну и не забывать, что на двухядерном процессоре больше двух счетных потоков заводить в общем случае смысла нет.
Скорее больше 3-х
Mulber
Как раз юзер-интерфейс можно выполнять в основном потоке, а вот счет - в дочерних потоках. Не забывать, что нужно использовать синхронизацию для записи из дочернего потока в юзер-интерфейс.
Это не важно, т.к. сильно зависит от компилятора, да и CPU-Cores + 1 поток всегда полезно иметь, т.к. потоки могут - обращаться к памяти/диску за большими кусками данных, закончиться и т.д - прирост 5-10 процентов обычно по сравнению с тем, чтобы ждать пока закончится один из потоков и запускать следующий.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения