Maksymalne wykorzystanie możliwości komputera do obliczeń

0

Mam 7 lub 8 parametrów, których wartość musi się mieścić w zakresie <1; 200>. Wszystkie są użyte w jednym równaniu. Chciałbym policzył dla jakich wartości tych parametrów działanie będzie miało największy wynik. W tym celu zrobiłem 7 pętli for parametr_n := 1 to 200 do. Każda kolejna jest wpisana w poprzednią, a w ostatniej jest działanie. O ile sam program działa dobrze, bo sprawdziłem to na mniejszym zakresie to po prostu strasznie wolno to oblicza. Zresztą na mniejszym zakresie trwało to ponad pół godziny, W końcu jest to bardzo dużo obliczeń. Chciałbym zapytać czy można w jakiś sposób to przyśpieszyć? Program po uruchomieniu zużywa ok 12-15% procesora i 2 MB pamięci. Co ważne, ten program jest tylko pomocniczy dla mnie i nie ma być uruchamiany na innym komputerze. Więc chciałbym wykorzystać możliwości mojego w jak największym stopniu.

0

Wielowątkowość albo OpenCL

0

Najlepiej jakbyś pokazał szczegóły problemu. Jak wyglądają te równania, jaką wartość masz maksymalizować itp.
Po tym się okaże jak najlepiej do tego podejść: siłowo (OpenCL) czy może miękko (algorytm genetyczny), a może jakaś inna prosta metoda optymalizacji (np Newtona).

2

Szybkie wyliczenie dla 7 parametrów, 2007 = 12800000000000000 = 12 800 000 miliardów
Gdyby więc twoje równanie dało się policzyć w ciągu 1 taktu procesora a twój procesor miał 5GHz to zajęłoby to 2560000 sekund czyli 30 dni.
Gdyby parametrów było 8 to zajęłoby to oczywiście 200 razy dłużej. Powodzenia.

Miej na uwadze że twój procesor zapewne ma ~3GHz a wyliczenie równania zajmuje przynajmniej kilkadziesiąt taktów, a może i kilkaset, zależnie od poziomu skomplikowania. Więc realnie czas obliczeń będzie przynajmniej o rząd/dwa rzędy wielkości większy...

0

Jakiś algorytm genetyczny powinien dać dobrą heurezę.

1

Pytanie czy funkcja, która jest wyliczana może zostać przetransformowana zgodnie z zasadą:

F(a_{1}, ... , a_{n}) = \sum\limits_{i=1}^n G_{i}(a_{i})

inaczej mówiąc czy można ją pociąć na sumę funkcji o mniejszej ilości parametrów.

0
MarekR22 napisał(a):

Najlepiej jakbyś pokazał szczegóły problemu. Jak wyglądają te równania, jaką wartość masz maksymalizować itp.
Po tym się okaże jak najlepiej do tego podejść: siłowo (OpenCL) czy może miękko (algorytm genetyczny), a może jakaś inna prosta metoda optymalizacji (np Newtona).

Wartosc := ((A / 100) * (SumaD - SumaM)) + ((B / 100) / CiagD * CiagM) + ((C / 100) * SumaM) + ((D / 100) * SumaD) + ((E / 100) / Maks * CiagM) + ((F / 100) * (0.25 - SumaM));

To jest działanie. Zmienne A-F to parametry które muszę obliczyć, tak aby Wartosc była największa. Na razie jest to 6 parametrów. To jest minimalna ilość, aby mogło zadziałać. Ale optymalnie by było dołożyć jeszcze 1 może dwa.

Tak, wiem, że jest to bardzo dużo obliczeń i zdaje sobie sprawę z tego, że może to długo potrwać. Nie liczę na wynik w ciągu kilku sekund. Ale też czekanie kilkudziesięciu dni wydaje mi się przesadą. Jedyne co mogę zmienić to jeszcze zakres dla każdego parametru z 200 do 150. Mimo wszystko jeśli się okaże, że nie będzie możliwe policzenie tego w szybszym tempie to będę musiał znaleźć inny sposób.

0

@dani17 moje obliczenia były dla bardzo optymistycznego przypadku, realnie spodziewałbym się że potrwa to przynajmniej z rok ;)

Prosty przykład: jeśli twoje obliczenia dla 6 parametrów wykonywałyby się w ciągu 1 sekundy to obliczenia dla 7 parametrów w 3,5 minuty a dla 8 prawie 12 godzin. Oczywiście nie ma takiej możliwości bo żeby obliczenia dla 6 parametrów trwały 1 sekundę potrzebowałbyś procesora z zegarem 64 000 GHz liczącego całe to wyrażenie w 1 takcie ;)

A czym są te wartości SumaD, SumaM, CiagD itd. One są zależne od parametrów jak rozumiem?

0

To są zmienne, obliczone z innej części na podstawie danych wprowadzonych przeze mnie.

W momencie uruchomienia funkcji która próbuje napisać one są już stałe i się nie zmieniają. Zmieniać maja się tylko parametry A-F, no i oczywiście Wartosc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0