GNU/Linux >> Linux Esercitazione >  >> Linux

Come puoi trovare il numero del processore su cui è in esecuzione un thread?

Per XP, un rapido google ha rivelato questo:

https://www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm Questo aiuta?


Se tutto ciò che vuoi fare è evitare la contesa, non è necessario conoscere la CPU corrente. Potresti semplicemente scegliere un mucchio a caso. Oppure potresti avere un heap per thread. Sebbene in questo modo si possa ottenere più o meno contesa, si eviterebbe il sovraccarico del polling della CPU corrente, che può essere significativo o meno. Dai un'occhiata anche a scalable_allocator di Intel Thread Building Block, che potrebbe aver già risolto il problema meglio di te.


Dall'output di man sched_getcpu :

NAME
       sched_getcpu - determine CPU on which the calling thread is running

SYNOPSIS
       #define _GNU_SOURCE
       #include <utmpx.h>

       int sched_getcpu(void);

DESCRIPTION
   sched_getcpu() returns the number of the CPU
   on which the calling thread is currently executing.

RETURN VALUE
   On success, sched_getcpu() returns a non-negative CPU number.
   On error, -1 is returned and errno is set to indicate the error.

SEE ALSO
   getcpu(2)

Sfortunatamente, questo è specifico per Linux. Dubito che ci sia un modo portatile per farlo.


Oltre alla risposta di Antony Vennard e al codice sul sito citato, ecco il codice che funzionerà anche per Visual C++ x64 (nessun assemblatore inline):

DWORD GetCurrentProcessorNumberXP() {
   int CPUInfo[4];   
   __cpuid(CPUInfo, 1);
   // CPUInfo[1] is EBX, bits 24-31 are APIC ID
   if ((CPUInfo[3] & (1 << 9)) == 0) return -1;  // no APIC on chip
   return (unsigned)CPUInfo[1] >> 24;
}

Un breve sguardo all'implementazione di GetCurrentProcessorNumber() su Win7 x64 mostra che usano un meccanismo diverso per ottenere il numero del processore, ma nei miei (pochi) test i risultati sono stati gli stessi per la mia funzione fatta in casa e quella ufficiale.


Linux
  1. Come puoi determinare le versioni installate delle librerie glibc?

  2. L'ID thread di un processo multithread può essere uguale all'ID processo di un altro processo in esecuzione?

  3. Come posso contare il numero di caratteri in una variabile Bash

  4. Come posso conoscere il percorso assoluto di un processo in esecuzione?

  5. Come posso trovare il file più vecchio in un albero di directory

Come trovare il numero di porta di un servizio in Linux

Come trovare il numero di core della CPU dalla riga di comando in Linux

Come trovare i 10 principali processi in esecuzione in base all'utilizzo di memoria e CPU

Come trovare informazioni sulla CPU in Linux utilizzando la riga di comando

Come trovare l'utilizzo della CPU, cosa blocca il sistema

Come trovare la versione di Linux in esecuzione