2011-11-30 7 views

risposta

13

Sì, le chiamate con nome lavoreranno per impostare affinità di thread. L'unico problema è quello di correggere il numero di thread e impostare la giusta affinità nel thread corretto (puoi provare a utilizzare la programmazione statica del ciclo for per il numero noto di thread).

Come noto, quasi ogni metodo consente di impostare l'affinità tramite l'ambiente. Il nome della variabile d'ambiente varia (non era stato allineato qualche tempo fa). Io uso la pagina http://www.spec.org/omp2001/results/omp2001.html per trovare l'implementazione di openMP e cercherò il nome della variabile di ambiente specifica. L'affinità è impostata in ~ metà dei risultati specOMP. Ci sono anche altre impostazioni di ottimizzazione delle prestazioni di OpenMP nei risultati.

E.g. For intel compiler la variabile è

export KMP_AFFINITY=compact,0 

For sun compiler:

export SUNW_MP_PROCBIND=TRUE 

For gcc (pre-openmp 3.1)

export GOMP_CPU_AFFINITY=0-63 

dove 63 è il numero massimo della CPU (quando contato da 0)

E newer OpenMP Standard, version 3.1 definisce ambiente OMP_PROC_BIND variabile (vedi secti 4.4) che è un modo standardizzato per impostare l'affinità in OpenMP. L'utilizzo è:

export OMP_PROC_BIND=true 
+0

grazie! niente a livello di linguaggio, come 'pthread_attr_setaffinity_np'? –

+0

no, lo standard openmp non ha pragma o funzioni vincolanti il ​​thread. L'unico modo (e uno raccomandato) è di legare i thread tramite variabile d'ambiente, specifica del compilatore o openmp3.1. Questa impostazione dovrebbe essere fatta in anticipo, prima di iniziare main. – osgx

+0

quindi, a rigor di termini, la tua risposta dovrebbe iniziare con "No" :) –