Dodaj wpis w tym temacie
Spis tematów | Strona: 1 2 ... 549 550 551 552 553 554 Wyślij wiadomość do admina |
Przewiń wpisy ↓ | moje ... oprogramowanie |
2025-03-03 (13:24)![]() Data rejestracji: 2016-05-12 Ilość postów: 8652 ![]() | wpis nr 1 555 905 [ CZCIONKA MONOSPACE ] 777ch> W efekcie eksperymentów z hit korelacjami nasuwają się wnioski: "test line" jest znacznie szybsza od [3/4]tic, nie mówiąc już o [1], ale... znacznie mniej "skuteczna". Na to co zejdzie przy [3/4] w ciągu 10 minut w "test line" potrzebuje godziny. |
2025-03-03 (14:12)![]() Data rejestracji: 2005-11-07 Ilość postów: 22655 ![]() | wpis nr 1 555 915 [ CZCIONKA MONOSPACE ] fair_play No tak Test line jest nieprecyzyjne 🥴 Pozostałe weryfikują gwarancję prawidłowo ale…to trwa za długo. I tak źle i tak ….niedobrze. To miał być program do —>niewielkiej liczby zakładów a zestawiać miał pokrycie no w/g wyliczeń 4z10 czy 3z6 tak aby pokrywać te wyliczanki na gwarancję 2,3,4 Jak wiadomo w kilkunastu czy kilkuset zakładach jest ewidentnie jakiś”kręgosłup”.. I to miało się odzwierciedlać w zestawianych zakładach … Reszta to już pogoń za rekordem pokrycia.. to przyszło przy okazji prób z rekordami na LJCR to nie było zamierzone… Już o tym pisałem kilka razy. --- wpis edytowano 2025-03-03 14:13 --- |
2025-03-04 (17:34)![]() Data rejestracji: 2005-11-07 Ilość postów: 22655 ![]() | wpis nr 1 556 073 [ CZCIONKA MONOSPACE ] test line" jest znacznie szybsza…. Nawet nie wiesz jak to śmiga bez updatowania ..ja wiem 🤭 Ale tak jak wcześniej wspomniałem Maska [adresy] nie mogą być jako byte a jako integer bo inaczej nie ma prawidłowego dodawania i odejmowania braków. A to …”zawęża”rozmiar tablic dla maski[index] do mniejszego —> [V] --- wpis edytowano 2025-03-04 17:35 --- |
2025-03-19 (19:54)![]() Data rejestracji: 2006-05-27 Ilość postów: 4979 ![]() | wpis nr 1 558 289 [ CZCIONKA MONOSPACE ] 777ch nic a nic nie rozumiem z tego co wpisałeś To nie moja bajka, ale z ciekawości ( i dla zabawy ) zapytałem o Twój problem "chatGPT o3 mini-high" Oto jego odpowiedź, może Ci coś to pomoże ? Problem wynika z nieprawidłowej inicjalizacji obiektów typu TStopwatch w poszczególnych taskach. W kodzie, dla każdego zadania zadeklarowano lokalną zmienną (np. t0, t1, t2, t3), ale zamiast utworzyć je metodą, która je poprawnie inicjalizuje (np. TStopwatch.StartNew), wywołuje się jedynie metodę Start na niezainicjalizowanej zmiennej. W efekcie w niektórych taskach stoper działa niepoprawnie, co skutkuje wyświetlaniem dziwnych, ujemnych lub bardzo dużych wartości czasu. Aby to naprawić, należy w każdym tasku zastąpić wywołanie: delphi Kopiuj T0.Start; odpowiednim przypisaniem, które inicjalizuje i jednocześnie uruchamia stoper, na przykład: delphi Kopiuj t0 := TStopwatch.StartNew; Analogicznie dla pozostałych: delphi Kopiuj t1 := TStopwatch.StartNew; t2 := TStopwatch.StartNew; t3 := TStopwatch.StartNew; Przykładowa poprawiona wersja dla pierwszego taska: delphi Kopiuj // proces task [0] tasks[0] := TTask.Create(procedure() var t0: TStopwatch; k0, probe0: integer; begin t0 := TStopwatch.StartNew; // poprawne uruchomienie stopera probe0 := 0; repeat k0 := random(80); inc(probe0); until (k0 = 2); t0.Stop; wynikiRdzeni[0] := k0; wynikczasu[0] := t0.Elapsed.ToString + ' ms'; wynikprobe[0] := probe0; end); Dzięki tej zmianie każdy task będzie posiadał poprawnie zainicjalizowany stoper, co zapewni właściwe pomiary czasu, zgodne z oczekiwaniami. Edit: Widzę, że usunąłeś swój post. Jeśli uznasz, że chat GPT pisze bzdury i do niczego ten wpis Ci się nie przyda, usuń post. Jeśli będziesz miał jakies pytania do AI, mogę je zadać w Twoim imieniu. Jeszcze przez kilka dni mam dostęp "plus" do tej platformy. --- wpis edytowano 2025-03-19 20:04 --- |
2025-03-19 (20:49)![]() Data rejestracji: 2005-11-07 Ilość postów: 22655 ![]() | wpis nr 1 558 303 [ CZCIONKA MONOSPACE ] Hejka Wierz lub nie ale początkowo miałem T0.startnew; i kolejne tak samo.. Ale okazało się że nie o to chodzi Otóż gdy wybór to random z 80 to {tasks proces} tak szybko się „odbywa” że między czasy chyba …głupieją Zmieniłem z 80 na 8-mln i już jest lepiej.. Jutro lub pojutrze dalej się przyglądnę temu procesowi to od początku do końca moja procedura Ale mam jeszcze kilka pomysłów na …jej bieg. Ale jesteś szybki👍 Po namyśle usunąłem bo jednak nie widzę tu nikogo kto temat może znać, a fair_play nie pisze w paskalu. |
2025-03-19 (20:59)![]() Data rejestracji: 2005-11-07 Ilość postów: 22655 ![]() | wpis nr 1 558 304 [ CZCIONKA MONOSPACE ] Ale dzięki jutro wrócę do startnew 👍 |
2025-03-19 (21:15)![]() Data rejestracji: 2006-05-27 Ilość postów: 4979 ![]() | wpis nr 1 558 307 [ CZCIONKA MONOSPACE ] cyt. "dy wybór to random z 80 to {tasks proces} tak szybko się „odbywa” że między czasy chyba …głupieją Zmieniłem z 80 na 8-mln i już jest lepiej.. Odpowiedź chat GPT Gdy zakres losowania jest bardzo mały (80), operacje wykonują się w ułamkach mikrosekundy – czyli czas pomiaru mieści się w granicach rozdzielczości stopera. W rezultacie, nawet minimalne różnice lub opóźnienia systemowe mogą powodować "dziwne" wyniki (czas bliski zeru, ujemne wartości przy konwersji czy zmienne wyniki). Gdy zwiększasz zakres do 8 mln, operacja trwa wystarczająco długo, by stoper mógł zmierzyć czas z większą precyzją, a wyniki stają się wiarygodne. Możliwe rozwiązania: Zwiększ liczbę iteracji: Możesz powielić operację (np. wykonać pętlę wewnątrz zadania wiele razy) tak, aby łączny czas był dłuższy i lepiej mierzalny. Agregacja wyników: Zamiast mierzyć pojedyncze, bardzo szybkie operacje, mierz sumaryczny czas wielu powtórzeń. Upewnij się, że stoper jest poprawnie inicjalizowany: Jak już ustaliliśmy, korzystaj z metody TStopwatch.StartNew, by uniknąć błędów związanych z niezainicjalizowanymi zmiennymi. Podsumowując, problem nie leży w logice zadania, a w fakcie, że mierzymy bardzo krótkie interwały czasowe, które przekraczają dokładność naszego narzędzia. W takich przypadkach warto zwiększyć obciążenie, aby wyniki były bardziej wiarygodne. Po pzeczytaniu usuń te "moje" wpisy. Zakłócają temat moje ... oprogramowanie ![]() |
2025-03-19 (22:36)![]() Data rejestracji: 2005-11-07 Ilość postów: 22655 ![]() | wpis nr 1 558 325 [ CZCIONKA MONOSPACE ] kleszek chatGPT może być pomocny. Jednak w tym przypadku nie doradził ....... NIC Zrezygnowałem ze stopera. wybór z random 8 mln losowy do skutku ......... do momentu gdy : random1 czyli pierwszy tasks wylosuje liczbę 2 z deklarowanej liczby 8000000 random2 czyli drugi tasks wylosuje liczbę 25 z deklarowanej liczby 8000000 random3 czyli trzeci tasks wylosuje liczbę 39 z deklarowanej liczby 8000000 random4 czyli czwarty tasks wylosuje liczbę 41 z deklarowanej liczby 8000000 oto czasy w milisekundach ..... jak widać -->masa operacji ![]() ![]() przy wyborze z 80 liczb ![]() natomiast przy 100 000 Resultat procesu [1] typ=liczba [2] z 100000 /rng/ Czas procesu {Elapsed time1 00:00:00:008} liczba prób = {125954} Resultat procesu [2] typ=liczba [25] z 100000 /rng/ Czas procesu {Elapsed time2 00:00:00:013} liczba prób = {183079} Resultat procesu [3] typ=liczba [39] z 100000 /rng/ Czas procesu {Elapsed time3 00:00:00:008} liczba prób = {244769} Resultat procesu [4] typ=liczba [41] z 100000 /rng/ Czas procesu {Elapsed time4 00:00:00:001} liczba prób = {9323} ----podsumowanie---- Sum wynik: 4/4 liczby typowane Elapsed Time task proces 00:00:00:017 Suma prób dla procesu 4/4 z 100000-liczb = 563125 jak widzisz czasy w okolicach 1~13 milisekund a sumaryczny czas procesu to 17 milisekund a --> człowiek mruga co cirka 400~500 milisekund a tu zrzut z programu dla 100 000 ![]() to tylko testy ,po to aby prawidłowo potasować procedury do tasowania ![]() pozdrawiam a użyłem dekodowania czasu w ten sposób: //zaczynamy mierzyć czas start1:= now; //czas pierwszy task //kończymy mierzenie czasu koniec2:= now; //ustalamy różnicę czasu timeDiff2:= koniec2 - start2; //dekodujemy czas na składowe czasu ![]() DecodeTime(timeDiff2, hours, minutes, seconds, millisec); //teraz ustalamy sami format zapisu if hours=0 then hgodz:='00' ; if (hours<10)and(hours>0) then hgodz:= '0' + inttostr(hours) ; if hours >= 10 then hgodz:=inttostr(hours); if minutes=0 then hmin:='00' ; if (minutes<10)and(minutes>0) then hmin:='0' + inttostr(minutes); if minutes>=10 then hmin:= inttostr(minutes); if seconds=0 then hsec:='00' ; if (seconds<10)and(seconds>0) then hsec:= '0' +inttostr(seconds) ; if seconds>=10 then hsec:= inttostr(seconds); if millisec=0 then hmilsec:='000'; if (millisec<10)and(millisec>0) then hmilsec:= '00'+inttostr(millisec); if (millisec<100)and(millisec>=10) then hmilsec:= '0'+inttostr(millisec); if millisec>=100 then hmilsec:= inttostr(millisec); upływ_czasu1:= 'Elapsed time1 '+ hgodz+':'+hmin+':'+hsec+':'+hmilsec; //zapisujemy czas trochę długa forma ale za to wynik upływu czasu prawidłowy bo nie -->pracuje prawidłowo na raz 5-stoperów<-- przy szybkich obliczeniach........ ![]() |
2025-03-19 (22:48)![]() Data rejestracji: 2005-11-07 Ilość postów: 22655 ![]() | wpis nr 1 558 326 [ CZCIONKA MONOSPACE ] a tu test=pula czyli zbiór = 100 mln zadanie polega na wylosowaniu 4 konkretnych liczb zadanie przydzielamy 4-em odrębnym random paskala każdy losuje własną 1 value z value=100mln koniec wtedy gdy: random1 wylosuje value=2 random2 wylosuje value=25 random3 wylosuje value=39 random4 wylosuje value=41 obrazek: ![]() czas całkowity operacji 2 s 186 milisekund w tym czasie wylosowano w sumie 272 mln 700tys 606 liczb aby trafić na 2,25,39,41 z wartości poczatkowej = 100mln |
2025-03-19 (22:56)![]() Data rejestracji: 2005-11-07 Ilość postów: 22655 ![]() | wpis nr 1 558 331 [ CZCIONKA MONOSPACE ] Ponieważ to Multihreading, to czasy procesów idą każdy niezależnie ...... a czas procesu nie jest sumą czasów wątków ,tylko czasem całkowitego zakończenia działania aplikacji. Ponieważ nie znam się na tym ,to się muszę pobawić i zrozumieć ...... bo jedni narzekają , a inni chwalą ..... ten sposób przetwarzania danych, niestety wymaga on najlepiej kilku lub wielu rdzeni procesora w komputerze. Multithreading, czyli wielowątkowość, to technika pozwalająca na jednoczesne wykonywanie wielu wątków w ramach jednej aplikacji. Wątek to najmniejsza jednostka wykonawcza, która może być uruchamiana na procesorze. W kontekście multithreadingu, każdy wątek działa niezależnie, ale wszystkie dzielą wspólne zasoby aplikacji, takie jak pamięć czy zmienne globalne. Dzięki temu możliwe jest równoległe przetwarzanie różnych zadań, co pozwala na bardziej efektywne wykorzystanie mocy obliczeniowej procesora. W praktyce procesory nowoczesnych komputerów mają wiele rdzeni (tzw. procesory wielordzeniowe), które pozwalają na wykonywanie wielu wątków równocześnie. Każdy rdzeń może obsługiwać jeden lub więcej wątków, co zwiększa wydajność systemu. |
2025-03-19 (23:06)![]() Data rejestracji: 2005-11-07 Ilość postów: 22655 ![]() | wpis nr 1 558 335 [ CZCIONKA MONOSPACE ] A...... co do problemu..... przy wyborze 4*po 1 z 80 liczb czas znalezienia 4* po jednej żądanej liczbie przy procesie na 4 wątki --> nie jest mierzalny w milisekundach raptem 3 milisekundy to czas głównie wypisu jak wcześniej na wstawionym powyżej i poniżej obrazku ![]() --- wpis edytowano 2025-03-19 23:07 --- |
2025-03-20 (08:54)![]() Data rejestracji: 2005-11-07 Ilość postów: 22655 ![]() | wpis nr 1 558 357 [ CZCIONKA MONOSPACE ] kleszek Jeśli będziesz miał jakies pytania do AI, mogę je zadać w Twoim imieniu. Jeszcze przez kilka dni mam dostęp "plus" do tej platformy. Poproszę zatem abyś zadał pytanie, dotyczące multithreading delphi object pascal. Mianowicie pytanie brzmi : Podaj przykład procedury obliczeń z użyciem pętli Loop ,z zastosowaniem Multithreadingu w delphi object pascal, dla 32 wątków jednocześnie wykonujących proces obliczeń. Przykład procedury obliczeń , której wynik jest zawsze ten sam, a czas obliczeń jest różny w zależności od ilości rdzeni procesora. Przykładowa procedura działać musi niezależnie od ilości rdzeni. no i ciekaw jestem ..co podpowie AI ![]() |
2025-03-20 (09:10)![]() Data rejestracji: 2005-11-07 Ilość postów: 22655 ![]() | wpis nr 1 558 361 [ CZCIONKA MONOSPACE ] Instrukcja iteracyjna jest to każda pętla (while, do..while, for) EDIT: Czyli instrukcja powtarzania pewnego zestawu poleceń. Nazwa wzięła się od łacińskiego słowa iteratio, itero ("powtarzanie" w wolnym tłumaczeniu). Iteracja oznacza także pojedyncze wykonanie pętli. --------------------------------------------------- A jak odpowie AI to skompilujemy i zobaczymy co podpowiedziała -------------------------------------------------- A jak odpowie to zadaj podobne pytanie ........ Mianowicie 2-pytanie brzmi : Podaj przykład procedury obliczeń z użyciem kilku instrukcji iteracyjnych ,z zastosowaniem Multithreadingu w delphi object pascal, dla 32 wątków jednocześnie wykonujących proces obliczeń. Przykład procedury obliczeń , której wynik jest zawsze ten sam, a czas obliczeń jest różny w zależności od ilości rdzeni procesora. Przykładowa procedura działać musi niezależnie od ilości rdzeni. pozdrawiam --- wpis edytowano 2025-03-20 09:14 --- |
2025-03-20 (09:41)![]() Data rejestracji: 2006-05-27 Ilość postów: 4979 ![]() | wpis nr 1 558 368 [ CZCIONKA MONOSPACE ] 777ch, zrobię to jak wrócę po pracy do domu. Około godziny 14-15 |
2025-03-20 (12:31)![]() Data rejestracji: 2020-08-05 Ilość postów: 5880 ![]() | wpis nr 1 558 391 [ CZCIONKA MONOSPACE ] Tworzymy 32 wątki za pomocą klasy TThread. Każdy wątek wykonuje iteracyjne obliczenia (np. sumowanie wartości z określonego zakresu). Synchronizujemy dostęp do wspólnej zmiennej GlobalSum przy użyciu TInterlocked.Add. Czekamy na zakończenie wszystkich wątków. Mierzymy czas wykonania dla różnych konfiguracji procesora. program MultiThreadedComputation; uses System.SysUtils, System.Classes, System.SyncObjs, System.Diagnostics; const THREAD_COUNT = 32; ITERATIONS = 1000000; // Ilość iteracji w każdym wątku var GlobalSum: Int64; // Globalna zmienna przechowująca wynik końcowy Threads: array [0..THREAD_COUNT - 1] of TThread; Stopwatch: TStopwatch; type TComputeThread = class(TThread) private FThreadID: Integer; protected procedure Execute; override; public constructor Create(ThreadID: Integer); end; constructor TComputeThread.Create(ThreadID: Integer); begin inherited Create(False); // Uruchamiamy wątek natychmiast FreeOnTerminate := False; // Nie usuwamy automatycznie FThreadID := ThreadID; end; procedure TComputeThread.Execute; var LocalSum: Int64; I: Integer; begin LocalSum := 0; for I := 1 to ITERATIONS do begin LocalSum := LocalSum + (I mod 10); // Przykładowe obliczenia end; TInterlocked.Add(GlobalSum, LocalSum); // Atomowe dodanie wyniku end; procedure RunComputation; var I: Integer; begin GlobalSum := 0; // Resetujemy globalny wynik Stopwatch := TStopwatch.StartNew; // Tworzymy i uruchamiamy wątki for I := 0 to THREAD_COUNT - 1 do Threads[I] := TComputeThread.Create(I); // Czekamy na zakończenie wszystkich wątków for I := 0 to THREAD_COUNT - 1 do begin Threads[I].WaitFor; Threads[I].Free; end; Stopwatch.Stop; Writeln('Wynik obliczeń: ', GlobalSum); Writeln('Czas wykonania (ms): ', Stopwatch.ElapsedMilliseconds); end; begin try Writeln('Rozpoczynamy wielowątkowe obliczenia...'); RunComputation; Writeln('Koniec obliczeń.'); except on E: Exception do Writeln('Błąd: ', E.Message); end; Readln; end. Tworzymy 32 wątki – TComputeThread, każdy wykonuje obliczenia w Execute. Każdy wątek iteruje ITERATIONS = 1 000 000 razy, dodając wartości do LocalSum. TInterlocked.Add zapewnia, że operacja dodawania do GlobalSum jest atomowa (unikamy problemów z równoczesnym dostępem do pamięci). Stopwatch mierzy czas wykonania i wynik jest wyświetlany. Właściwości tej implementacji: ✅ Wynik zawsze ten sam – suma z 32 wątków jest zawsze identyczna. ✅ Czas zależny od CPU – na wielordzeniowych CPU wykonuje się szybciej, ale działa również na jednordzeniowych procesorach. ✅ Zastosowanie TInterlocked – zapewnia synchronizację wątków bez potrzeby stosowania krytycznych sekcji (TMonitor, TCriticalSection). ✅ Zgodność z różnymi wersjami Delphi – działa w Delphi XE i nowszych. |
2025-03-20 (13:53)![]() Data rejestracji: 2006-05-27 Ilość postów: 4979 ![]() | wpis nr 1 558 403 [ CZCIONKA MONOSPACE ] Pytanie multithreading delphi object pascal Podaj przykład procedury obliczeń z użyciem pętli Loop ,z zastosowaniem Multithreadingu w delphi object pascal, dla 32 wątków jednocześnie wykonujących proces obliczeń. Przykład procedury obliczeń , której wynik jest zawsze ten sam, a czas obliczeń jest różny w zależności od ilości rdzeni procesora. Przykładowa procedura działać musi niezależnie od ilości rdzeni. Odpowiedź Poniżej przedstawiam przykładowy kod w Delphi (Object Pascal), który tworzy 32 wątki – każdy z nich wykonuje pętlę obliczeniową (w tym przykładzie sumuje funkcję sinus w określonym zakresie). Wynik całkowity jest deterministyczny (przy tych samych ustawieniach ITER_COUNT), a czas wykonania zależy od liczby rdzeni procesora, ponieważ wątki będą planowane przez system operacyjny niezależnie od dostępnych rdzeni. procedure MultiThreadedCalculation; const THREAD_COUNT = 32; // liczba wątków ITER_COUNT = 1000000; // liczba iteracji w każdym wątku (można zwiększyć, aby obciążenie było większe) var Threads: array of TThread; Results: array of Double; i: Integer; GlobalResult: Double; begin SetLength(Threads, THREAD_COUNT); SetLength(Results, THREAD_COUNT); // Inicjalizacja wyników dla każdego wątku for i := 0 to THREAD_COUNT - 1 do Results[i] := 0.0; // Tworzenie i uruchamianie wątków for i := 0 to THREAD_COUNT - 1 do begin // Używamy lokalnej zmiennej 'idx', aby zapewnić poprawne przekazanie numeru wątku var idx: Integer; idx := i; Threads[i] := TThread.CreateAnonymousThread( procedure var j: Integer; LocalResult: Double; begin LocalResult := 0.0; // Przykładowe obliczenia – suma wartości Sin(j) for j := 1 to ITER_COUNT do LocalResult := LocalResult + Sin(j); Results[idx] := LocalResult; end ); Threads[i].Start; end; // Oczekiwanie na zakończenie wszystkich wątków for i := 0 to THREAD_COUNT - 1 do Threads[i].WaitFor; // Sumowanie wyników z poszczególnych wątków GlobalResult := 0.0; for i := 0 to THREAD_COUNT - 1 do GlobalResult := GlobalResult + Results[i]; // Wyświetlenie wyniku WriteLn(Format('Wynik obliczeń: %f', [GlobalResult])); end; Kilka uwag: Deterministyczność: Obliczenia (suma sinusa) są deterministyczne – przy tym samym ITER_COUNT wynik będzie zawsze taki sam. Wielowątkowość: Nawet jeśli komputer ma mniej niż 32 rdzenie, procedura utworzy 32 wątki. System operacyjny sam rozplanuje ich wykonanie na dostępnych rdzeniach, co wpłynie na czas obliczeń. Lokalna zmienna 'idx': Dzięki użyciu lokalnej zmiennej 'idx' unikamy problemu zamknięcia (closure) w anonimowej procedurze, co gwarantuje, że każdy wątek zapisze wynik do właściwego elementu tablicy. Przykładowa procedura działa niezależnie od ilości rdzeni – niezależnie od sprzętu, zawsze zostanie uruchomionych 32 wątki, a czas wykonania będzie odzwierciedlał możliwości obliczeniowe komputera. |
2025-03-20 (13:57)![]() Data rejestracji: 2006-05-27 Ilość postów: 4979 ![]() | wpis nr 1 558 406 [ CZCIONKA MONOSPACE ] Pytanie 2 Podaj przykład procedury obliczeń z użyciem kilku instrukcji iteracyjnych ,z zastosowaniem Multithreadingu w delphi object pascal, dla 32 wątków jednocześnie wykonujących proces obliczeń. Przykład procedury obliczeń , której wynik jest zawsze ten sam, a czas obliczeń jest różny w zależności od ilości rdzeni procesora. Przykładowa procedura działać musi niezależnie od ilości rdzeni. Odpowiedź Poniżej przykład procedury w Delphi (Object Pascal), w której dla 32 wątków równolegle wykonywane są dwa zestawy iteracyjnych obliczeń. Każdy wątek wykonuje: Pierwszą pętlę – sumuje iloczyn sinusa i cosinusa kolejnych liczb, Drugą pętlę – dodaje logarytm (ln) z wartości (j + 1). Wynik końcowy jest sumą wyników wszystkich wątków. Dzięki temu, mimo że każdy wątek wykonuje te same obliczenia, czas ich wykonania zależy od liczby rdzeni procesora (system sam rozdziela wątki na dostępne rdzenie), a procedura działa niezależnie od ich liczby. procedure MultiThreadedCalculation; const THREAD_COUNT = 32; // liczba wątków ITER1_COUNT = 100000; // liczba iteracji w pierwszej pętli ITER2_COUNT = 50000; // liczba iteracji w drugiej pętli var Threads: array of TThread; Results: array of Double; i: Integer; GlobalResult: Double; begin SetLength(Threads, THREAD_COUNT); SetLength(Results, THREAD_COUNT); for i := 0 to THREAD_COUNT - 1 do Results[i] := 0.0; // Tworzymy i uruchamiamy 32 wątki for i := 0 to THREAD_COUNT - 1 do begin var idx: Integer := i; // zmienna pomocnicza, aby uniknąć problemu zamknięcia (closure) Threads[i] := TThread.CreateAnonymousThread( procedure var j: Integer; LocalResult: Double; begin LocalResult := 0.0; // Pierwsza pętla iteracyjna – obliczenia z użyciem sinusa i cosinusa for j := 1 to ITER1_COUNT do LocalResult := LocalResult + Sin(j) * Cos(j); // Druga pętla iteracyjna – obliczenia z użyciem logarytmu naturalnego for j := 1 to ITER2_COUNT do LocalResult := LocalResult + Ln(j + 1); // Zapis wyniku dla danego wątku Results[idx] := LocalResult; end ); Threads[i].Start; end; // Oczekiwanie na zakończenie wszystkich wątków for i := 0 to THREAD_COUNT - 1 do Threads[i].WaitFor; // Sumujemy wyniki z poszczególnych wątków GlobalResult := 0.0; for i := 0 to THREAD_COUNT - 1 do GlobalResult := GlobalResult + Results[i]; // Wyświetlenie końcowego wyniku WriteLn(Format('Wynik obliczeń: %f', [GlobalResult])); end; Uwagi: Deterministyczność: Obliczenia w każdej pętli są deterministyczne, więc dla ustalonych stałych ITER1_COUNT i ITER2_COUNT wynik końcowy będzie zawsze taki sam. Wielowątkowość: Nawet jeśli komputer ma mniej niż 32 rdzenie, procedura utworzy 32 wątki – system operacyjny rozplanuje ich wykonanie na dostępnych rdzeniach, co wpływa na czas obliczeń. Niezależność od liczby rdzeni: Procedura działa zawsze tak samo, niezależnie od sprzętowych możliwości, a czas wykonania obliczeń zależy jedynie od dostępnych rdzeni procesora. Ten przykład ilustruje, jak wykorzystać multithreading wraz z kilkoma instrukcjami iteracyjnymi w Delphi, aby osiągnąć deterministyczne wyniki przy zmiennym czasie wykonania zależnym od konfiguracji sprzętowej. |
2025-03-20 (14:13)![]() Data rejestracji: 2020-08-05 Ilość postów: 5880 ![]() | wpis nr 1 558 407 [ CZCIONKA MONOSPACE ] To samo pytanie i różne odpowiedzi. Kleszek zadaj to samo jeszcze raz i co otrzymasz ? |
2025-03-20 (14:20)![]() Data rejestracji: 2020-08-05 Ilość postów: 5880 ![]() | wpis nr 1 558 408 [ CZCIONKA MONOSPACE ] Jest jeszcze problem oceny tego co dostajesz, bo w każdej opowiedzi mogą być zawarte bzdury, wyrwane z kontekstu fragmenty cudzych kodów, albo niepasujące do używanej wersji delphi a czasem zupełnie wymyślone Kolejne pytanie czy czat darmowy czy płatny. Przecież ostrzegają na początku, że czat może popełniać błędy A co zwerifikujesz, przecież to nie jest forum programistów. |
2025-03-20 (14:23)![]() Data rejestracji: 2020-08-05 Ilość postów: 5880 ![]() | wpis nr 1 558 410 [ CZCIONKA MONOSPACE ] Pytanie dla Copilota: Podaj przykład procedury obliczeń z użyciem kilku instrukcji iteracyjnych ,z zastosowaniem Multithreadingu w delphi object pascal, dla 32 wątków jednocześnie wykonujących proces obliczeń. Przykład procedury obliczeń , której wynik jest zawsze ten sam, a czas obliczeń jest różny w zależności od ilości rdzeni procesora. Przykładowa procedura działać musi niezależnie od ilości rdzeni. ======================================================= Oto przykład procedury w Delphi Object Pascal, która wykorzystuje 32 wątki do obliczeń. Wynik procedury pozostaje taki sam, niezależnie od liczby rdzeni procesora, ale czas wykonania zależy od dostępnych zasobów sprzętowych. Procedura opiera się na technikach wielowątkowości z użyciem klasy TTask z System.Threading: delphi program MultiThreadExample; uses System.SysUtils, System.Threading; const ThreadCount = 32; function ComputeTask(Index: Integer): Integer; var Sum, I: Integer; begin Sum := 0; for I := 1 to 100000000 do Sum := (Sum + Index) mod 1000; // Prosta iteracyjna operacja obliczeniowa Result := Sum; end; procedure RunMultiThreadedComputation; var Results: array[0..ThreadCount - 1] of Integer; Tasks: array[0..ThreadCount - 1] of ITask; I: Integer; FinalSum: Integer; begin // Tworzymy i uruchamiamy 32 wątki for I := 0 to ThreadCount - 1 do begin Tasks[I] := TTask.Run( procedure begin Results[I] := ComputeTask(I); end ); end; // Oczekiwanie na zakończenie wszystkich wątków TTask.WaitForAll(Tasks); // Zbieranie wyników FinalSum := 0; for I := 0 to ThreadCount - 1 do Inc(FinalSum, Results[I]); Writeln('Final Sum: ', FinalSum); end; begin try Writeln('Starting multi-threaded computation...'); RunMultiThreadedComputation; Writeln('Computation complete.'); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. Wyjaśnienie: Iteracyjne obliczenia: Funkcja ComputeTask wykonuje iteracje, które realizują proste obliczenia. W tym przykładzie, obliczenia zawsze zwracają przewidywalny wynik dla tej samej liczby Index. Wielowątkowość: TTask pozwala na równoległe wykonywanie kodu w niezależnych wątkach. Niezależność od liczby rdzeni: Program uruchamia 32 wątki, niezależnie od liczby rdzeni procesora. Czas wykonania będzie różny w zależności od liczby rdzeni, ale wynik pozostanie spójny. Synchronizacja: TTask.WaitForAll zapewnia, że wszystkie wątki zakończą swoje działanie przed kontynuacją programu. |
| Dodaj wpis w tym temacie | Spis tematów | Wyniki lotto | Strona: 1 2 ... 549 550 551 552 553 554 Wyślij wiadomość do admina |