2011-11-30 4 views
5

Dire che ho il seguente programma c:come forzare il programma ac per essere eseguito su un particolare nucleo

#include <stdio.h> 

int main() 
{ 
    printf("Hello world \n"); 
    getchar(); 

    return 0; 
} 

gcc 1.c -o helloworld 

e, dire che ho un dual core macchina:

cat /proc/cpuinfo | grep processor | wc -l 

Ora la mia domanda è , quando eseguiamo il programma, come possiamo forzare l'esecuzione di questo programma in core-0 (o in qualsiasi altro core particolare)?

Come eseguire questa operazione a livello di programmazione? esempi, api, codice di riferimento sarebbero utili.

Se non ci sono API disponibili, ci sono tempi di compilazione, tempo di collegamento, tempo di caricamento di questo?

OTOH, come verificare se un programma è in esecuzione in core-0 o core-1 (o qualsiasi altro core)?

+1

Questo non è nell'ambito di C. È necessario controllare la documentazione del sistema operativo per verificare se il sistema operativo espone tale funzione. –

+1

Sotto Linux è possibile impostare l'affinità utilizzando taskset, inoltre sono d'accordo con Kerrek che questa è più una domanda del sistema operativo –

+0

Mentre è possibile utilizzare taskset per impostare l'affinità principale di un processo avviato in seguito, chiede chiaramente una API e come fare programmaticamente – hirschhornsalz

risposta

5

Poiché si sta parlando di/proc/cpu, presumo che si stia utilizzando Linux. In Linux si usa la funzione sched_setaffinity. Nel tuo esempio si sarebbe chiamata

cpu_set_t set; 
CPU_ZERO(&set);  // clear cpu mask 
CPU_SET(0, &set);  // set cpu 0 
sched_setaffinity(0, sizeof(cpu_set_t), &set); // 0 is the calling process 

Guardi su man sched_setaffinity per maggiori dettagli.

3

Questo è specifico per il sistema operativo. Come sottolinea Felice, puoi farlo su Linux chiamando lo sched_setaffinity nel tuo programma. Se finisci per girare su più piattaforme, dovrai codificare qualcosa di diverso per ognuna.

In alternativa, è possibile specificare l'affinità quando si avvia l'eseguibile, dalla riga di comando o da uno script di esecuzione o altro. Vedere taskset per uno strumento da riga di comando Linux.