I/cgroup/cpuset/set1. set1 ha 2-5,8. Voglio associare un processo a quel cpuset e quindi collegare un thread in quel processo, per esempio, al nucleo 4. Il nome del cpuset e il nome del thread e il core a cui dovrei legare il thread è nel file di configurazione m. Esistono API C per analizzare cpuset? Qual è il modo corretto per ottenere il pinning usando il codice C?Blocco di un thread in un core in un cpuset tramite C
risposta
Dai un'occhiata alle funzioni pthread_setaffinity_np
e pthread_getaffinity_np
.
Esempio:
#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
int
main(int argc, char *argv[])
{
int s, j;
cpu_set_t cpuset;
pthread_t thread;
thread = pthread_self();
/* Set affinity mask to include CPUs 0 to 7 */
CPU_ZERO(&cpuset);
for (j = 0; j < 8; j++)
CPU_SET(j, &cpuset);
s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_setaffinity_np");
/* Check the actual affinity mask assigned to the thread */
s = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_getaffinity_np");
printf("Set returned by pthread_getaffinity_np() contained:\n");
for (j = 0; j < CPU_SETSIZE; j++)
if (CPU_ISSET(j, &cpuset))
printf(" CPU %d\n", j);
exit(EXIT_SUCCESS);
}
Per maggiori dettagli, vedere la man page.
penso che il dettaglio più necessario sarebbe '#define _GNU_SOURCE' in alto':) ' –
@ DavidC.Rankin Grazie. Modificato. – dbush
Certo, l'unica ragione per cui ho trovato che il tuo post mi ha fatto imbattersi in una parte di pthreads che non avevo mai visto prima, così sono andato a dare un'occhiata. Grazie. –
Chiamare la seguente funzione e passare qualsiasi ID di nucleo che si desidera passare. Anche da dove si chiama questa funzione non controllare il suo valore di ritorno per essere 1.
short CorePin(int coreID)
{
short status=0;
int nThreads = std::thread::hardware_concurrency();
//std::cout<<nThreads;
cpu_set_t set;
std::cout<<"\nPinning to Core:"<<coreID<<"\n";
CPU_ZERO(&set);
if(coreID == -1)
{
status=-1;
std::cout<<"CoreID is -1"<<"\n";
return status;
}
if(coreID > nThreads)
{
std::cout<<"Invalid CORE ID"<<"\n";
return status;
}
CPU_SET(coreID,&set);
if(sched_setaffinity(0, sizeof(cpu_set_t), &set) < 0)
{
std::cout<<"Unable to Set Affinity"<<"\n";
return -1;
}
return 1;
}
- 1. Blocco di un mutex in un distruttore in C++ 11
- 2. infinito abort() in un backrace di un core core del programma C++
- 3. sintassi per definire un blocco che prende un blocco e restituisce un blocco in Objective-C
- 4. Wrapping di chiamate asincrone in un thread di blocco sincrono?
- 5. Creazione di un elemento in Tridion 2011 tramite Core Service
- 6. Esecuzione di un nuovo thread all'interno di un blocco sincronizzato
- 7. Arresto di un thread bloccato a una chiamata di blocco
- 8. C# che esce da un blocco using() con un thread ancora in esecuzione sull'oggetto ambito
- 9. AutoResetEvent come sostituzione di un blocco in C#?
- 10. Come passare più di un parametro in un thread C#?
- 11. Monadi multipli in un blocco di blocco
- 12. I thread sono in attesa su un blocco FIFO?
- 13. Come uccidere un thread istantaneamente in C#?
- 14. Condivisione di un blocco sincronizzato Java in un cluster o utilizzando un blocco globale?
- 15. Come acquisire un blocco tramite una chiave
- 16. Posso eseguire un thread all'interno di un thread in java?
- 17. Perché l'uso di taskset per eseguire un programma Linux multi-thread su un insieme di core isolati fa sì che tutti i thread vengano eseguiti su un core?
- 18. Come impostare l'affinità core della CPU di un thread Java?
- 19. Che cos'è un blocco statico in c o C++?
- 20. Attendere il completamento di un thread staccato in C++
- 21. C# Esegue solo un thread
- 22. Quando utilizzare il thread di blocco in C#?
- 23. Ottenere thread affinità core in C++ 11 attraverso pthreads
- 24. Il codice C libera un blocco?
- 25. Creazione di un IMP da un blocco Objective-C
- 26. come interrompere un thread in un threadpool
- 27. Memorizzazione di un NSImage in un Core Data modello
- 28. BufferedReader in un ambiente multi-core
- 29. È meglio avere un blocco sincronizzato all'interno di un blocco try o un blocco try all'interno di un blocco sincronizzato?
- 30. Un'attività C# viene eseguita su un core?
possibile vittima di http://stackoverflow.com/questions/2563442/cpu-affinity-masks-putting-threads-on-different -cpus –
Non c'è linguaggio C/C++! Queste sono due lingue diverse. – Olaf
@Olaf ok. Corretto a C. – Prashanth