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;
}
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