Pełna moc obliczeniowa na skompilowany program c++

0

Cześć!
Napisałem program w C++, który oblicza mi pewne wartości. Nie jestem jakims kotem programowania wiec użyłem prostych pętli for oraz while. Niestety wyliczenie odpowiedzi na moim laptopie zajmuje bardzo dużo czasu. Nawet po nadaniu wysokiego priorytetu na ten proces zużywa on maksymalnie 9% procesora. Co mogę zrobić?

7

Zrównoleglic te obliczenia na wszystkie rdzenie procesora..

0

Masz na myśli wybór wszystkich procesorów w ustawieniach procesu? Jeśli tak to zrobiłem to.

1

Użyć wielu watkow w Twoim programie: https://infotraining.bitbucket.io/cpp-thd/

1

Można też użyć CUDA o ile karta graficzna pozwala.

0
daniel1302 napisał(a):

Uzyz wielu watkow w Twoim programie: https://infotraining.bitbucket.io/cpp-thd/

@daniel1302: Hmm, a co w przypadku kiedy jedna pętla jest zależna od drugiej która sprawdza wyniki pierwszej? Wtedy używanie wątków nie ma sensu bo współbieżne wykonanie tego jest nie przyniesie rezultatu. A może się mylę?

@_13th_Dragon: To jest to! Tez to tym myslalem ale nie mam pojęcia jak c++ połączyć z CUDA. Możesz mnie jakiś naprowadzić?

5

To ci nie pomoże 9% świadczy o tym że gdzie indziej jest wąskie gardło.

0

@_13th_Dragon: Ok, główna pętla opiera się na while dopóki nie zostanie zwrócony odpowiedni warunek. Wewnątrz jest for i jeden IF. Na co mam zwrócić uwagę przy optymalizacji?

0

Pusty for obciąży CPU na 100%, zatem Twoje obliczenia muszą być przez coś blokowane... @_13th_Dragon ma pewnie rację - analizujesz dane wczytywane z jakiegoś urządzenia ?

2

Możesz zrównoleglić obliczenia, ale pierwsze co bym zrobił, to sprawdziłbym czy złożoność obliczeniowa Twojego algorytmu jest optymalna dla problemu, który chcesz rozwiązać. Pokaż kod oraz opisz problem, który rozwiązujesz.

Być może przerzucenie obliczeń na kartę graficzną, albo chociaż ich zrównoleglenie będzie sensowne, ale to nie jest trywialne dla początkującego i pierw szukałbym oszczędności algorytmicznych.

6

Najlepiej pokaż kod. Te 9% wskazuje, że masz w kodzie wąskie gardło, które jest najprawdopodobniej wynikiem błędu w kodzie.
Może nieoptymalnie wczytujesz/wypisujesz dane, tym co mało dłubią w C++ często się to zdarza.

Bez kodu i opisu co to ma robić, równie dobrze możemy pogadać o kształcie chmurek na niebie.

1
Maslo napisał(a):
daniel1302 napisał(a):

Uzyz wielu watkow w Twoim programie: https://infotraining.bitbucket.io/cpp-thd/

@daniel1302: Hmm, a co w przypadku kiedy jedna pętla jest zależna od drugiej która sprawdza wyniki pierwszej? Wtedy używanie wątków nie ma sensu bo współbieżne wykonanie tego jest nie przyniesie rezultatu. A może się mylę?

Pętla druga może działać w tym samym czasie co pierwsza na częściowych danych, przykładowo https://www.codeproject.com/Articles/5281878/Producer-Consumer-Queues-in-Cplusplus
Na pewno da się podzielić to na mniejsze zadania które można zrównoleglić, ale dopóki nie opiszesz konkretnego problemu to nikt w tym nie pomoże. CUDA cudów nie zdziała, pozwoli jedynie na jeszcze większe zrównoleglenie operacji, ale ty masz najwyraźniej problem żeby to rozdzielić na dwa rdzenie więc nie ma co mówić o 6 tysiącach rdzeni

5

Pokaż kod !
Albo jakiś pseudo kod jak Twój algorytm działa.

@Maslo nie obraź się (teraz wszyscy tacy wrażliwi) ale po treści pytania to ja skromnie uważam że CUDA to jeszcze nie ten poziom, najpierw naucz się dzielić problem na CPU a potem dopiero przejdź na GPU.

1
Maslo napisał(a):
daniel1302 napisał(a):

Uzyz wielu watkow w Twoim programie: https://infotraining.bitbucket.io/cpp-thd/

@daniel1302: Hmm, a co w przypadku kiedy jedna pętla jest zależna od drugiej która sprawdza wyniki pierwszej? Wtedy używanie wątków nie ma sensu bo współbieżne wykonanie tego jest nie przyniesie rezultatu. A może się mylę?

@_13th_Dragon: To jest to! Tez to tym myslalem ale nie mam pojęcia jak c++ połączyć z CUDA. Możesz mnie jakiś naprowadzić?

Jesli pierwsza petla jest zalezna od drugiej, to moze warto zmienic to podejscie? Albo np jesli cos liczysz to moze warto wyznaczyc jakies przedzialy danych wejsciowych i liczyc rownolegle dla mniejszych przedzialow?

1

kodu chyba nie zobaczymy ale powtórzę i dodam od siebie:

  1. Dobór algorytmu,
  2. Sprawdzenie może czy nie ma czasami po prostu tam błędu?
  3. Użyć SIMD procesora(jesli konieczne).
  4. A teraz ode mnie nie wiem co tam liczysz, część funkcji w matlab jest od razu zrównoleglona więc można próbować przepisać na mcode. jest też osobny tollbox do multithreading
  5. Jeśli nie masz matlab możesz spróbować użyć scilab. Też niektóre funkcje sa zrównoleglone. Podobnie jak matlab tez ma dodatkowy "toolbox" do wątków.
  6. Sam scilab jaki matlab używa bilbiotek które już sa zooptymalizowane pod użycie SIMD, więc kolejne odpada.

Podsumowując proponuję to jednak przepisać do matlab czy scilab. To obliczenia to może być ciekawe zwarzywszy na to że out of the box możesz już dostac boosta z samej konsturkcji ww. programów.

3

Myślę że nie ma co cudować z CUDA czy nawet SIMD jeśli to 9% oznacza 100% jednego z 12 rdzeni. (dyskusję że powinno wyjść 8% uznam za żart :) )

1

Witam Panowie!
Nie spodziewałem się takiej reakcji z waszej strony, jestem mega pozytywnie zaskoczony. Nie wchodziłem tutaj bo męczą mnie terminy w firmie i nawet nie mialem czasu o tym pomyśleć. Wyślę kod w weekend, opiera on się na funkcji rand wiec myśle ze to jest powód opóźnienia. Czytałem ze jest ona pseudolosowa związana scisle z czasem taktowania procesora i tutaj pewnie jest problem.

5

@Maslo przypominamy się o kod ;)

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