WinFuture-Forum.de: Multi-core Programmierung - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Multi-core Programmierung


#1 Mitglied ist offline   free 

  • Gruppe: aktive Mitglieder
  • Beiträge: 948
  • Beigetreten: 18. Dezember 04
  • Reputation: 0

geschrieben 22. Mai 2007 - 08:43

Hallo,

was ist denn bei Multi-Core Programmierung zu beachten? Sprache ist jetzt mal egal...

Ich habe festgestellt, dass "einfache" Programme mit 2 Threads auf Ein-Kern-Prozessoren trotzdem schneller laufen. Liegt wohl an der Synchronisation und Overhead.
Wie optimiere ich soll einen Code für DualCores?

Wie weit ist momentan der Entwicklungsstand?

Brauche das ganze für eine Seminararbeit

danke,
free
Eingefügtes Bild
0

Anzeige



#2 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 22. Mai 2007 - 08:59

Als einfachstes Beispiel eine for-schleife:

for (int i = 0; i< 10000; i++) {
   // Hier machen wir irgendeine komplizierte Berechnung, die den Prozessor auslastet
}

Und sowas kann man in der Regel schon in zwei parallele Threads auslagern. z.b. nimmt der eine Thread die geraden Indizes der andere die ungeraden.
for (int i = 0; i< 10000; i += 2) {
   // Hier die geraden
}

for (int i = 1; i< 10000; i += 2) {
   // Hier die ungeraden
}


Es gibt aber Bibliotheken für C/C++ die dir sowas schon automatisch abnehmen. Die bekannteste hiervon dürfte OpenMP sein
0

#3 Mitglied ist offline   free 

  • Gruppe: aktive Mitglieder
  • Beiträge: 948
  • Beigetreten: 18. Dezember 04
  • Reputation: 0

geschrieben 22. Mai 2007 - 09:03

Danke Witi!

Ich habe hier mal ein Code
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

volatile int x = 0, y = 0;/* 'volatile' is important! */


pthread_mutex_t x_mutex, y_mutex;


#define ITERATIONS 50000000
/* good value for Athlon 900, eventually adjust for faster/slower processors */
void *thread_routine_0 (void *data) 
{
	int n;
	
	for (n = 0; n < ITERATIONS; n++) {
		pthread_mutex_lock (&x_mutex);
		pthread_mutex_lock (&y_mutex);
		
		x++;
		y += 2;
		
		pthread_mutex_unlock (&x_mutex);
		pthread_mutex_unlock (&y_mutex);
		}
	return NULL; /* we do not want to return any data */
}

void *thread_routine_1 (void *data)
{
	int n;
	
	for (n = 0; n < ITERATIONS; n++) {
		pthread_mutex_lock (&x_mutex);
		pthread_mutex_lock (&y_mutex);
		
		x += 2;
		y++;
		
		pthread_mutex_unlock (&x_mutex);
		pthread_mutex_unlock (&y_mutex);
		}
	return NULL; /* we do not want to return any data */
}

int main () {
	pthread_t threads[2];
	int n;
	/* Init mutexes... */
	pthread_mutex_init (&x_mutex, NULL); /* 'NULL' = options (defaults are ok) */
	pthread_mutex_init (&y_mutex, NULL); /* 'NULL' = options (defaults are ok) */
	/* Create threads */
	if (pthread_create (&threads[0], NULL, thread_routine_0, NULL) != 0) 
	{
		puts ("Error creating thread #0!");
		exit (3);
	}
	if (pthread_create (&threads[1], NULL, thread_routine_1, NULL) != 0) 
	{
		puts ("Error creating thread #1!");
		exit (3);
	}
	/* Join the threads (wait until they finished) */
	for (n = 0; n < 2; n++)
		pthread_join (threads[n], NULL);
		/* Cleanup mutexes... */
		pthread_mutex_destroy (&x_mutex);
		pthread_mutex_destroy (&y_mutex);
		/* Print the final values of x and y */
		printf ("x = %i, y = %i\n", x, y);
	return 0;
}


Das Programm läuft auf einem Kern immer schneller. Bis um das 3-fache. Hier habe ich ja auch 2 Threads.
Eingefügtes Bild
0

#4 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 22. Mai 2007 - 09:21

Das wundert mich jetzt nicht unbedingt.

Man sagt z.B. beim Kompilieren unter Gentoo, dass man die Anzahl der Threads so festlegt, dass sie eins mehr als die Anzahl der Kerne/Prozessoren beträgt.

Gibt aus meiner Sicht eine einfache Erklärung dafür:
Es vergeht eine gewisse Zeit während ein Thread seine aktuelle Aufgabe beendet und eine neue anfängt. In dieser Zeit ist der Prozessor nicht ausgelastet. Es sei denn es springt ein dritter Thread rein und nutzt das aus...
0

#5 Mitglied ist offline   free 

  • Gruppe: aktive Mitglieder
  • Beiträge: 948
  • Beigetreten: 18. Dezember 04
  • Reputation: 0

geschrieben 22. Mai 2007 - 09:22

Hmm....Wie würde eine dritte Threadroutine aussehen?
Eingefügtes Bild
0

#6 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 22. Mai 2007 - 09:24

Drei Threads nur, wenn du zwei Kerne/Prozessoren hast, bei einem somit zwei Threads.

Diese sollten eigentlich alle gleich aussehen.
0

#7 Mitglied ist offline   free 

  • Gruppe: aktive Mitglieder
  • Beiträge: 948
  • Beigetreten: 18. Dezember 04
  • Reputation: 0

geschrieben 22. Mai 2007 - 09:25

Bei T1:
x++;
		y += 2;


T2:
x += 2;
		y++;


T3: ?

Dieser Beitrag wurde von free bearbeitet: 22. Mai 2007 - 09:26

Eingefügtes Bild
0

#8 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 22. Mai 2007 - 09:33

int max_threads = 3;
int len = 500000;
for (int i = 0; i < max_threads; i++) {
	for (int j = i; j < len; j += max_threads); // T1 fängt an bei j=0, T2 j=1, T3 j=2 ...
}


Sowas kannst du dir aber sparen, da das die Bibliotheken schon für dich übernehmen. Wie gesagt, schau dir mal den Wiki-Artikel zu OpenMP an und die dazugehörigen Beispiele.
0

#9 Mitglied ist offline   free 

  • Gruppe: aktive Mitglieder
  • Beiträge: 948
  • Beigetreten: 18. Dezember 04
  • Reputation: 0

geschrieben 22. Mai 2007 - 20:19

Ich nochmal kurz zu meinem Problem ;)

Ich habe jetzt ein Programm, mit 2 Threads. Das Programm läuft jetzt auf 2 Kerne ca. 1,9x schneller als auf einem. Das passt schomal :wink:

Das gleiche habe ich jetzt mit 3 Threads laufen lassen. Verteilen müsste ja 2:1 sein. Allerdings läuft das Programm mit 3 Threads trotzdem doppelt so schnell. Das dürft normal doch nicht sein, oder?
Eingefügtes Bild
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0