DualCore - Prozess einem Kern zuweisen

aniram

Mitglied
Hallo,
ich brauch dringend und v.a.schnell eure Hilfe.

Ich habe ein Programm mit mehrere Threads. Jetzt möchte ich das Programm auf nur einem Kern (haben den Core2Duo) laufen lassen.

Ich habe schon viel gegooglet, bin doch nicht richtig fündig geworden. :(

Soviel wie ich weiß, sollte das mit der Funktion
Code:
sched_setaffinity()
gehen.

Hat hier jemand mal ein Codebeispiel, wie ich den Kern1 oder Kern2 zuweisen kann?

Danke für eure Hilfe!
 
Hallo,

ich hab zwar keinen Multicore hier und kann deswegen auch kein konkretes Beispiel geben, aber hast du schonmal ein wenig mit sched_setaffinity rumprobiert?

Also laut man Page würd ichs mal mit folgendem versuchen:

C:
cpu_set_t set;
CPU_ZERO(&set);
CPU_SET(0, &set);
if (sched_setaffinity(0, sizeof(cpu_set_t), &set) < 0)
  perror("Error in sched_setaffinity()");

Gruß,
RedWing
 
Hi,
das Beispiel geht leider nicht ganz.

Brauch ich noch eine Bibliothek dazu? Habe leider mit sched_setaffinity noch nicht viel gemacht. Brauche das für eine Seminararbeit

Habe das noch gefunden. Jedoch werde ich nicht ganz schlau darauf
Code:
int sched_setaffinity(pid_t pid, unsigned int cpusetsize,
                      cpu_set_t *mask);

int sched_getaffinity(pid_t pid, unsigned int cpusetsize,
                      cpu_set_t *mask);

void CPU_CLR(int cpu, cpu_set_t *set);

int CPU_ISSET(int cpu, cpu_set_t *set);

void CPU_SET(int cpu, cpu_set_t *set);

void CPU_ZERO(cpu_set_t *set);
 
Zuletzt bearbeitet:
Hi,
das Beispiel geht leider nicht ganz.

Brauch ich noch eine Bibliothek dazu?
Was geht denn nicht bzw was ist der Fehler? Gibt es Linker Probleme? Wenn ja wie schauen die aus? Bei funktionalen Fehlern kann ich dir leider auch nich helfen da ich hier kein Multicore hab und meine Hypothesen so nicht testen kann :)

Habe das noch gefunden. Jedoch werde ich nicht ganz schlau darauf
Code:
int sched_setaffinity(pid_t pid, unsigned int cpusetsize,
                      cpu_set_t *mask);

int sched_getaffinity(pid_t pid, unsigned int cpusetsize,
                      cpu_set_t *mask);

void CPU_CLR(int cpu, cpu_set_t *set);

int CPU_ISSET(int cpu, cpu_set_t *set);

void CPU_SET(int cpu, cpu_set_t *set);

void CPU_ZERO(cpu_set_t *set);

Das ist doch genau das was ich im Bsp. auch verwende:
Das Prinzip der API funktioniert ähnlich denke ich mal wie bei der von select:
Du hast ein Feld vom Typ cpu_set_t wo jedes einzelne Element in diesem Feld die jeweilige CPU repräsentiert. CPU_ZERO initialisiert dieses Feld mit 0en. CPU_SET enabled eine bestimmte CPU mit dem jeweiligen Index "cpu" und CPU_CLEAR disabled die jeweilige CPU mit dem Index 'cpu', so entnehm ich das zumindest der man Page:

http://www.die.net/doc/linux/man/man2/sched_setaffinity.2.html

Gruß,
RedWing
 
Du kannst ja auch mal zu Testzwecken von deinem Programm, was ich nehme mal an momentan von 2 Cores bedient wird, die affinity mit getaffinity auslesen und dann mit CPU_ISSET überprüfen welche Bits in dem Feld gesetzt sind was du zurückbekommst und schauen ob es deinen Erwartungen entspricht.

Gruß,
RedWing
 
Habs jez so probiert
Code:
int mask = 0xFFFFFFFF;

int sched_setaffinity(pid_t pid, unsigned int cpusetsize,
                      cpu_set_t *mask);

0xFFFFFFFF
is all processors (#0 through #31)


0x00000001
is processor #0


Müsste doch so stimmen, oder?
 
Habs jez so probiert
Code:
int mask = 0xFFFFFFFF;

int sched_setaffinity(pid_t pid, unsigned int cpusetsize,
                      cpu_set_t *mask);

0xFFFFFFFF
is all processors (#0 through #31)


0x00000001
is processor #0


Müsste doch so stimmen, oder?

Ich glaube die haben die Makros CPU_SET, CPU_CLEAR, CPU_ZERO, etc nicht umsonst definiert ;)
Du solltest diese und insbesondere auch den Datentyp cpu_set_t verwenden, ansonsten ist die Wahrsch. noch geringer das es funktioniert :)

Gruß,
RedWing
 
Was geht denn nicht bzw was ist der Fehler? Gibt es Linker Probleme? Wenn ja wie schauen die aus? Bei funktionalen Fehlern kann ich dir leider auch nich helfen da ich hier kein Multicore hab und meine Hypothesen so nicht testen kann :)

cpu_2.c:13: error: expected declaration specifiers or '...' before '&' token
cpu_2.c:13: warning: data definition has no type or storage class
cpu_2.c:14: error: expected declaration specifiers or '...' before numeric constant
cpu_2.c:14: error: expected declaration specifiers or '...' before '&' token
cpu_2.c:14: warning: data definition has no type or storage class
cpu_2.c:15: error: expected identifier or '(' before 'if'


L= line
Code:
L13:CPU_ZERO(&set);
L14: CPU_SET(0, &set);
L15:if (sched_setaffinity(0, sizeof(cpu_set_t), &set) < 0)
 

Neue Beiträge

Zurück