Ich habe/cgroup/cpuset/set1. set1 hat 2-5,8. Ich möchte einen Prozess an diesen CPU-Satz binden und dann einen Thread in diesem Prozess an Kern 4 anheften. Der Name des CPU-Satzes und der Thread-Name und der Kern, an den ich den Thread binden soll, sind in der Konfigurationsdatei m. Gibt es C-APIs zum Parsen von CPU-Satz? Was ist der richtige Weg, um das Pinning mit C-Code zu erreichen?Einen Thread an einen Kern in einem CPU-Satz durch C fixieren
Antwort
Schauen Sie sich die Funktionen pthread_setaffinity_np
und pthread_getaffinity_np
an.
Beispiel:
#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);
}
Weitere Einzelheiten finden Sie in der man page.
Ich denke, das wichtigste Detail wäre '#define _GNU_SOURCE' oben ':) ' –
@ DavidC.Rankin Thanks. Bearbeitet. – dbush
Sicher, der einzige Grund, warum ich es gefunden habe, war, dass dein Beitrag mich über einen Teil von Pthreads stolperte, den ich noch nie zuvor gesehen hatte, also ging ich hin und schaute. Vielen Dank. –
Rufen Sie die folgende Funktion auf und übergeben Sie die Kern-ID, die Sie übergeben möchten. Auch von wo auch immer Sie diese Funktion rufen Sie den Rückgabewert überprüfen 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. Übergeben einer Nachricht an einen anderen Thread in C#
- 2. Wie bindet man einen Prozess an einen bestimmten Kern in freebsd/linux
- 3. Übergabe von Parametern an einen Thread
- 4. Warum seltsame Timing-Ergebnisse angezeigt werden, obwohl ein Thread an einen bestimmten CPU-Kern gebunden ist?
- 5. Fixieren von IEnumerables in C#
- 6. C++ einen Vektor an einen anderen anhängen
- 7. Senden einer Nachricht an einen Handler auf einem toten Thread
- 8. Übergeben von Identitätswechsel-Token für einen verwalteten Thread an einen nicht verwalteten Thread
- 9. Einen Socket-Stream in einem Thread ausführen
- 10. Was hält C++ 11 für einen "Thread"?
- 11. Auf Win32, wie verschiebst du einen Thread auf einen anderen CPU-Kern?
- 12. durch einen C Looping # Sammlungen
- 13. Android: Aktivitätszerstörung und Thread zeigen einen AlertDialog an
- 14. Java - benachrichtigen Sie einen äußeren Thread von einem inneren Thread
- 15. NULL an einen Strukturzeiger in C übergeben?
- 16. Einen Thread in Java stoppen?
- 17. Wie benenne ich einen Thread in Linux?
- 18. Wie kann man einen Toast in einem Handler/Thread anzeigen?
- 19. Wie übergeben Sie mehr als einen Parameter an einen C# -Thread?
- 20. So schlafen Sie einen C++ Boost-Thread
- 21. Einen Thread abbrechen?
- 22. Geben Sie einem Boost-Thread einen Namen?
- 23. C++ - Thread: Wie sende ich eine Nachricht an einen anderen Long-Live-Thread?
- 24. Wie stoppe ich einen Thread von einem anderen Thread
- 25. Einen EventHandler für einen Thread ausführen
- 26. Zuweisen von 1 CPU-Kern zu 1 Thread C++
- 27. Wie bekomme ich einen Thread-Status von einem anderen Thread?
- 28. Wie kann ich einen schlafenden Thread in C# aufwecken?
- 29. Wie man einen freigegebenen Kern (DDD) in .Net richtig einführt
- 30. Fixieren von TensorFlow OpKernels zu spezifischen Kernen
Mögliche Betrogene von http://stackoverflow.com/questions/2563442/cpu-affinity-masks-putting-threads-on-different sein -cpus –
Es gibt keine Sprache C/C++! Dies sind zwei verschiedene Sprachen. – Olaf
@Olaf ok. Korrigiert zu C. – Prashanth