[c/c++] wątki + smp

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

ArChaNGeL
Użytkownik
Posty: 5
Rejestracja: 2006-08-09, 13:50

[c/c++] wątki + smp

Post autor: ArChaNGeL »

witam.
na wstępnie zacznę od tego że znawcą linuxa nie jestem, a programuję w nim tylko dlatego, że wątki w windowsie po prostu mnie dobijają... z racji tego,że o linuxie niewiele wiem, to proszę Was o pomoc...

program działa na watkach. generalnie czyta on dane z pliku, uruchamia ilosc watkow wprowadzona przez użytkownika, watki działają na danych z pliku, a jak skończą to program również kończy działanie. Generalnie mam laptopa dwurdzeniowego i zastanawiam sie czy informacja którą otrzymuję po zalogowaniu do systemu :

Kod: Zaznacz cały

Linux 2.6.24.5-smp
definitywnie świadczy o tym że linux widzi dobrze moje dwa rdzenie i ze żadnych dodatkowy modułów czy tam czegoś innego instalować nie trzeba? jezeli tak - to chciałbym dowiedzieć się o jakimś źródle informacji jak przydzielać zadania do poszczególnych procesorów w linuxie gdyż chyba nie potrafię znaleźć jednoznaczniej informacji na ten temat. generalnie program który pisze dosyć dużo liczy i zastanawiam się czy on używa tylko jednego procesora czy dwóch - da się to jakoś łatwo w linuxie sprawdzić?

generalnie to chyba tyle. z góry dziękuję za wszelką pomoc i w razie czego sorry za banalny poziom trudności problemu :)

pozdrawiam
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [c/c++] wątki + smp

Post autor: mina86 »

ArChaNGeL pisze:ilosc watkow
liczbę
ArChaNGeL pisze:definitywnie świadczy o tym że linux widzi dobrze moje dwa rdzenie
Nie. Oznacza ona, że jądro jest w stanie obsłużyć wiele procesorów/rdzeniów, choć w 99,9% przypadków jest to równoznaczne z tym, iż faktycznie wykorzystuje oba rdzenie. Aby się upewnić przeanalizuj zawartość pliku /proc/cpuinfo (np. poleceniem cat /proc/cpuinfo) -- powinny tam być wyszczególnione oba rdzenie.
ArChaNGeL pisze:to chciałbym dowiedzieć się o jakimś źródle informacji jak przydzielać zadania do poszczególnych procesorów w linuxie gdyż chyba nie potrafię znaleźć jednoznaczniej informacji na ten temat.
Po co? W większości przypadków nie ma potrzeby przydzielać wątków konkretnym procesorom -- jądro samo sobie wszystko poprzydziela.
ArChaNGeL pisze:generalnie program który pisze dosyć dużo liczy i zastanawiam się czy on używa tylko jednego procesora czy dwóch - da się to jakoś łatwo w linuxie sprawdzić?
Najprościej chyba poleceniem top lub innymi miernikami wykorzystania procesora.

[ Dodano: 2008-10-05, 17:51 ]
Aha, jeszcze jedno. Prosiłbym o stosowanie przycisku Shift.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
ArChaNGeL
Użytkownik
Posty: 5
Rejestracja: 2006-08-09, 13:50

Re: [c/c++] wątki + smp

Post autor: ArChaNGeL »

mina86 - dzięki za odpowiedź.
mina86 pisze:
ArChaNGeL pisze:ilosc watkow
liczbę
Ok :)
mina86 pisze:Po co? W większości przypadków nie ma potrzeby przydzielać wątków konkretnym procesorom -- jądro samo sobie wszystko poprzydziela.
ten program jest silnie związany z podziałem zadań. Tym samym, to jest chyba wyjątek od tej większości i zastanawiam się czy coś takiego da się w jakiś sposób zrobić. Generalnie rozbicie tych wątków "ręcznie" jest jednym z etapów całego projektu, więc jest to dla mnie trochę bardziej niż konieczne.

Więc wciąż, jakby ktoś znał jakieś źródła informacji na ten temat - dzięki za nie z góry.
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [c/c++] wątki + smp

Post autor: mina86 »

ArChaNGeL pisze:ten program jest silnie związany z podziałem zadań. Tym samym, to jest chyba wyjątek od tej większości i zastanawiam się czy coś takiego da się w jakiś sposób zrobić. Generalnie rozbicie tych wątków "ręcznie" jest jednym z etapów całego projektu, więc jest to dla mnie trochę bardziej niż konieczne.
No dobra, więc dzielisz problem na podproblemy (czy co tam), rozdzielasz zadania pomiędzy wątki i gotowe. Do czego jest Ci potrzebne przypisywanie konkretnych wątków do konkretnych procesorów? Bo generalnie da się to zrobić, ale o ile wiem trzeba łatać jądro.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
joi
Użytkownik
Posty: 151
Rejestracja: 2004-10-12, 20:32
Lokalizacja: raczej nie stąd ;)
Kontakt:

Re: [c/c++] wątki + smp

Post autor: joi »

Kod: Zaznacz cały

man sched_setaffinity
ale na 99% nie potrzebujesz tego
Pajaczek
Użytkownik
Posty: 1439
Rejestracja: 2006-08-03, 13:16
Lokalizacja: Winny Gród

Re: [c/c++] wątki + smp

Post autor: Pajaczek »

ArChaNGeL pisze:Więc wciąż, jakby ktoś znał jakieś źródła informacji na ten temat - dzięki za nie z góry
Dość dobrym źródłem informacji nt. temat jest książka "Linux kernel - przewodnik programisty", niestety dostępna tylko na rynku wtórnym.

Ps. No proszę, mina86, taki wojownik o poprawną pisownię, nie wyłapał czegoś uważanego tu za błąd...
Awatar użytkownika
sanczol
Użytkownik
Posty: 415
Rejestracja: 2005-03-17, 21:21
Lokalizacja: Warszawa
Kontakt:

Re: [c/c++] wątki + smp

Post autor: sanczol »

@ArChaNGeL, wszystko zależy od tego której biblioteki wątków chciałbyś użyć.

Do wyboru masz min:
- OpenMP (http://openmp.org)
- Posix Threads (masz ją już w swoim Linux'ie) - polecam

OpenMP jest to całkiem fajna biblioteka, zyskująca coraz większą popularność. Teoretycznie do napisanego kodu wystarczy, że dodasz odpowiednio dyrektywy preprocesora, chociaż bez drobnych zmian w kodzie zazwyczaj też się nie obejdzie. Generalnie stworzona została z myślą maksymalnego uproszczenia pisania programów wielowątkowych, bez konieczności kontrolowania każdego wątku z osobna. Być może do twoich celów będzie odpowiednia.

Dzięki Posix Threads (pthreads) możesz mieć kontrolę absolutną nad wątkami. Będziesz w stanie tworzyć wątki, przydzielać im niezależne (lub zależne) od siebie zadania, scalać wyniki obliczeń różnych wątków, zaprogramować komunikację między nimi i wiele wiele więcej, możliwości są nieograniczone ;-)
Jednak wiąże się to ze większym nakładem pracy i może okazać się to dość trudne. Jednak myślę, że warto bo będziesz wiedział dokładnie co dzieje się w twoim programie.

Dokumentacje jak używać pthreads znajdziesz na stronach man, np.:

Kod: Zaznacz cały

man pthread_create
man pthread_join
itd.
Do tego mogą ci się przydać semafory, np:

Kod: Zaznacz cały

man sem_init
man sem_post
man sem_wait
itd.
i mutex'y, np.:

Kod: Zaznacz cały

man pthread_mutex_init
man pthread_mutex_init
itd.
Na początek polecałbym OpenMP bo być może wystarczy do twojego zadania i zaoszczędzisz dużo czasu. W razie problemów z OpenMP (czasem bywa ciężko) przejdź na Posix Threads, tym bardziej jeśli lubisz programować.

W razie problemów pisz.

pozdrawiam
Arch Linux
kernel current
Samsung RF711
HP Compaq nx7400 [EY508ES]
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [c/c++] wątki + smp

Post autor: mina86 »

Zrobiłem sobie proste porównanie szybkości działania muteksów oraz semaforów, z którego wyszło, iż te pierwsze są dwa razy szybsze. Można więc próbować wyciągnąć wniosek, iż zamiast stosować semafory lepiej je implementować przy pomocy muteksów.

Kod: Zaznacz cały

#include <stdio.h>
#include <pthread.h>


#if !defined ITERATIONS
#  define ITERATIONS 10000000
#endif
#if !defined THREADS
#  define THREADS 10
#endif


#if TEST_SEM
#  if TEST_MUTEX
#    error TEST_SEM and TEST_MUTEX cannot be defined at the same time
#  else
#    include <semaphore.h>

struct Mutex {
	Mutex() { sem_init(&mutex, 0, 1); }
	~Mutex() { sem_destroy(&mutex); }
	void lock() { sem_wait(&mutex); }
	void unlock() { sem_post(&mutex); }
private:
	Mutex(const Mutex &m) { (void)m; }
	sem_t mutex;
};

#  endif
#elif TEST_MUTEX

struct Mutex {
	Mutex() { pthread_mutex_init(&mutex, 0); }
	~Mutex() { pthread_mutex_destroy(&mutex); }
	void lock() { pthread_mutex_lock(&mutex); }
	void unlock() { pthread_mutex_unlock(&mutex); }
private:
	Mutex(const Mutex &m) { (void)m; }
	pthread_mutex_t mutex;
};

#else
#  error Either TEST_SEM or TEST_MUTEX must be defined
#endif


struct Value {
	Value(unsigned long v = 0) : value(v) { }

	unsigned long get() const {
		Locker locker(mutex);
		return value;
	}

	void inc() {
		Locker locker(mutex);
		++value;
	}

private:
	struct Locker {
		Locker(Mutex &m) : mutex(m) { mutex.lock(); }
		~Locker() { mutex.unlock(); }
	private:
		Locker(const Locker &l) : mutex(l.mutex) { }
		Mutex &mutex;
	};

	mutable Mutex mutex;
	unsigned long value;
};


struct ThreadEnv {
	ThreadEnv(unsigned i = 1000000) : value(0), iterations(i) { }

	Value value;
	const unsigned iterations;
};

static void *thread(void *_env);


int main(void) {
	ThreadEnv env(ITERATIONS);

	pthread_t threads[THREADS];
	unsigned i = sizeof threads / sizeof *threads;
	do {
		pthread_create(threads + --i, 0, thread, &env);
	} while (i);

	i = sizeof threads / sizeof *threads;
	do {
		pthread_join(threads[--i], 0);
	} while (i);

	unsigned long v = env.value.get();
	printf("value = %ld\n", v);

	return env.iterations * (sizeof threads / sizeof *threads);
}


static void *thread(void *_env) {
	Value &value = static_cast<ThreadEnv*>(_env)->value;
	unsigned i = static_cast<ThreadEnv*>(_env)->iterations;
	do { value.inc(); } while (--i);
	return 0;
}


[ Dodano: 2008-10-07, 00:08 ]

Kod: Zaznacz cały

[mina86@erwin ~/code]$ time ./mutex-benchmark ; time ./sem-benchmark 
value = 100000000

real    0m12.202s
user    0m10.486s
sys     0m0.170s
value = 100000000

real    0m24.136s
user    0m13.532s
sys     0m7.506s
[mina86@erwin ~/code]$ 


[ Dodano: 2008-10-07, 00:09 ]
Z włączoną optymalziacją (-O2 i takie tam):

Kod: Zaznacz cały

[mina86@erwin ~/code]$ time ./mutex-benchmark ; time ./sem-benchmark 
value = 100000000

real    0m6.262s
user    0m5.370s
sys     0m0.097s
value = 100000000

real    0m14.505s
user    0m7.779s
sys     0m5.120s
[mina86@erwin ~/code]$ 
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Awatar użytkownika
sanczol
Użytkownik
Posty: 415
Rejestracja: 2005-03-17, 21:21
Lokalizacja: Warszawa
Kontakt:

Re: [c/c++] wątki + smp

Post autor: sanczol »

@mina86, że też Ci się chciało, jeśli chodzi o kod to komplikator działał pełną parą. ;-)
Jest to mało czytelne nawet jak na tak prosty programik.
Arch Linux
kernel current
Samsung RF711
HP Compaq nx7400 [EY508ES]
ArChaNGeL
Użytkownik
Posty: 5
Rejestracja: 2006-08-09, 13:50

Re: [c/c++] wątki + smp

Post autor: ArChaNGeL »

wielkie dzięki wszystkim za odpowiedź. napewno mi to pomoże!
sorry ze dopierdo teraz, ale nie bylo mnie na necie ostatnio...
pozdrawiam!
ODPOWIEDZ