Skocz do zawartości

[DLL] GMThreads


Rekomendowane odpowiedzi

  • Odpowiedzi 172
  • Dodano
  • Ostatniej odpowiedzi

Top użytkownicy w tym temacie

Top użytkownicy w tym temacie

Za grosz mojej wypowiedzi nie zrozumiałeś, tylko sobie posta nabiłeś, który się ma kompletnie nijak do mojego. Co mnie obchodzi sprawdzanie ilości rdzeni, do czego funkcję widziałem. Mnie interesuje, czy jest pewna automatyzacja związana z tym przydzielaniem do rdzeni w przypadku, gdy program chce rozdzielić na więcej rdzeni, niż komputer autentycznie posiada, czy trzeba samemu się babrać z tym, co moim zdaniem by było głupie i zwielokrotniło ilość pracy do wykonania.

Odnośnik do komentarza
Udostępnij na innych stronach

Mnie interesuje, czy jest pewna automatyzacja związana z tym przydzielaniem do rdzeni w przypadku, gdy program chce rozdzielić na więcej rdzeni, niż komputer autentycznie posiada

Wtedy funkcje zwrócą błąd.

 

Jak chcesz mieć jakąkolwiek automatyzację, to nie nakładaj na wątki żadnych masek, wtedy scheduler sam będzie decydował o tym gdzie i kiedy wątki będą wykonywane. Oczywiście może wyjść tak, że wszystkie wątki będą wykonywane na głównym rdzeniu/procesorze.

 

Lepiej zaprogramować to samemu, jeśli chcesz tym lepiej zarządzać.

Odnośnik do komentarza
Udostępnij na innych stronach

Dlatego raczej nie skorzystam z tego DLL. Wolę sam rozdzielić pracę na rdzenie według uznania, ale ogólnie by bardzo się zwielokrotniła praca i zwiększyła ilość kodu, jakbym musiał sprawdzać ile jest rdzeni, jak rozdzielić jak jest mniej niż przewidywałem, itd. Cóż, programowanie... to już wykracza daleko poza bariery prostoty GMa ;p .

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
jest też windows xp 64... ;p więc się mylisz ;)

 

I to też nic nie ma do znaczenia. 64 obsługuje po prostu 64bitowe procki, zamiast 32 bitowe.

Owszem zwykyły XP przydziela wątki jednemu PROCESOROWI i więcej nie obsługuje, co nie znaczy, że nie obsługuje więcej RDZENI. Przecież teraz większość procesorów jest dwurdzeniowa. (komputer z procesorem dwurdzeniowym, a komputer dwuprocesorowy to nie to samo)

Odnośnik do komentarza
Udostępnij na innych stronach

Dlatego raczej nie skorzystam z tego DLL. Wolę sam rozdzielić pracę na rdzenie według uznania, ale ogólnie by bardzo się zwielokrotniła praca i zwiększyła ilość kodu, jakbym musiał sprawdzać ile jest rdzeni, jak rozdzielić jak jest mniej niż przewidywałem, itd. Cóż, programowanie... to już wykracza daleko poza bariery prostoty GMa ;p .

 

 

Tworzysz nowy wątek, jeśli masz 2 rdzenie pójdzie na drugi jeśli nie będzie działał na pierwszym proste. Jak będziesz rozdzielał według uznania to nic dobrego raczej z tego nie wyniknie no chyba, że jesteś pro w wielowątkowości. Użyj mt z WinAPI czy ZThread, boost. W thinking in c++ w tomie 2 jest dość obszerne wyjaśnienie biblioteki ZThread.

Odnośnik do komentarza
Udostępnij na innych stronach

will on ma dopierro 15 lat... ty maturę pewnie za rok masz wiec ocb...

 

Tak więc na test na koniec gimnazjum. 15 lat to wystarczająco aby potrafić czytać ze zrozumieniem szczególnie, że nie ograniczał

go czas.

 

 

edit: @down Ale tylko minimalnie ;p

 

10 punkt regulaminu

Borek

Odnośnik do komentarza
Udostępnij na innych stronach

A od czego masz funkcje sprawdzającą liczbe rdzeni? Kilka if'ów i masz załatwione

No to super, ale tym osobom, którzy mają jeden rdzeń w procesorze funkcja zwróci wartość -1, czyli błąd. IFa dasz i co? To tylko zapobiegnie użyciu wątku.

 

Z drugiej strony, można po else wstawiać wątki do pierwszego rdzenia, która na pewno jest lub po prostu zrobić zmienną z ilością rdzeni i jeśli wynosi ona 4 to przypisać do odpowiednich zmiennych nr tych rdzeni, czyli:

GML
rdzen1 = 1; // 0001

rdzen2 = 2; // 0010

rdzen3 = 4; // 0100

rdzen4 = 8; // 1000

a jak jest mniej to przekazywać pracę poprzedniemu rdzeniowi:

GML
rdzen1 = 1; // 0001

rdzen2 = 2; // 0010

rdzen3 = 4; // 0100

rdzen4 = 4; // 0100, przejmuje nr poprzedniego rdzenia, czyli jeśli nie ma czwartego rdzenia, to jest on traktowany jako trzeci rdzeń

Tak to widzę, ale nie znam się, więc nie mówię, że to jest bezbłędne.

Odnośnik do komentarza
Udostępnij na innych stronach

O, właśnie. Pomyliłem się wcześniej z thread_affinity_mask w opisie - gdy wystąpi błąd zwraca 0, nie -1 :) już poprawiłem posty.

 

No to super, ale tym osobom, którzy mają jeden rdzeń w procesorze funkcja zwróci wartość -1, czyli błąd. IFa dasz i co? To tylko zapobiegnie użyciu wątku.

Mu chodziło raczej o coś takiego:

GML
global.thread = thread_create( "jakis kod GML", 1 );

 

switch ( thread_num_of_processors() ) {

case 2: thread_affinity_mask( global.thread, 2 ); break; // maska na drugi rdzeń

case 3: thread_affinity_mask( global.thread, 4 ); break; // maska na trzeci rdzeń

case 4: thread_affinity_mask( global.thread, 8 ); break; // maska na czwarty rdzeń

}

// W innym wypadku maska nie będzie ustawiona

// lub

if ( thread_num_of_processors() > 1 )

thread_affinity_mask( global.thread, 2 ); // maska na drugi rdzeń

// można by zrobić też tak

thread_affinity_mask( global.thread, 1 + ( thread_num_of_processors() > 1 ) ); // maska na drugi rdzeń ( jeśli istnieje takowy )

// czy tam

thread_affinity_mask( global.thread, 1 << thread_num_of_processors() - 1 ); // maska na ostatni rdzeń

Odnośnik do komentarza
Udostępnij na innych stronach

  • 4 miesiące temu...
  • 2 miesiące temu...

Zauważyłem błąd w GMThreads. Kiedy mam dwa działące wątki to podczas wykonywania skryptu:

global.r = script_if(global.a,'TRUE','FALSE')

script_if:
if(argument0) then return argument1
return argument2

script_if czasami zwraca 0 niezależnie od argumentów (nawet jeśli są to stringi!)

To się nie dzieje bez GMThreads.

 

Błąd obejmuje wszystkie niestandardowe skrypty wykonywane w wątkach i Game Maker.

Odnośnik do komentarza
Udostępnij na innych stronach

Jako taki ład i skład ma.

 

Jeśli arg0 jest prawdziwy to zwraca arg1, a jak nie to arg2.

Czli arg0 to warunek, a arg1 i arg2 to możliwe wyniki.

 

Ale ogólnie to bez sensu jest, bo to takie zastąpienie zwykłego ifa funkcją żeby kod trochę skrócić :P

 

Znaczy trochę sensu ma. Jeśli używa tego dużo to ma przejrzyściej niż jakby ifował ciągle.

Odnośnik do komentarza
Udostępnij na innych stronach

@SerMSYS: Hm, ten błąd występuje pewnie dlatego, że GM nie jest przystosowany do multi-threadingu i dlatego przechwytuje niewłaściwe parametry przekazane do skryptu... na to raczej nic nie da się poradzić ale sprawdzę jeszcze.

Odnośnik do komentarza
Udostępnij na innych stronach

Hm, wprowadzając taką funkcję musiałbym też dodać funkcję "zamykającą" uchwyt wątku, bo jakoś trzeba będzie zwalniać pamięć którą trzeba zachować dla każdego wątku by móc odczytać błąd, więc będzie nieco mniej wygodnie ;p no chyba, że zrobiłbym opcję automatycznego zwalniania ustawianą w thread_create, której można by użyć gdy nie będzie takiej potrzeby by sprawdzać błąd ;o

 

Ok, w wolnym czasie dodam tą funkcje + funkcje służące do synchronizacji wątków które już dawno miałem zamiar wprowadzić.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...