2012-04-20 11 views
5

Il termine divergenza di thread viene utilizzato in CUDA; dal mio punto di vista è una situazione in cui diversi thread sono assegnati a compiti diversi e questo si traduce in un grande successo di prestazioni.Divergenza tra thread di apertura?

Mi chiedevo, c'è una penalità simile per fare questo in openmp? Ad esempio, supponiamo di avere un processore 6 core e un programma con 6 thread. Se ho un condizionale che fa eseguire a 3 thread un determinato task, e quindi gli altri tre thread eseguono un'attività completamente diversa, ci sarà un grande successo nelle prestazioni? Immagino che in sostanza sia una specie di uso di openmp per fare MIMD.

Fondamentalmente, sto scrivendo un programma con openmp e CUDA. Voglio due thread per eseguire un kernel CUDA mentre gli altri thread lasciati eseguono il codice C. Grazie.

+0

Solo curioso, come si fa a fare questo in OpenMP? So che hai già risposto alla tua domanda, ma sarebbe bello vedere un pezzo di codice. –

+0

Questo è off-topic, ma prima di rendere il tuo codice host eccessivamente complicato, potresti non aver bisogno di più di un thread della CPU per CUDA - con CUDA 4.0 e successive la programmazione multi-GPU può essere eseguita da un singolo thread host, quindi a meno hai del lavoro parallelo da fare sul lato host, più thread potrebbero non aggiungere altro che complessità. Se si ha del lavoro parallelo sulla CPU, si può usare un thread della CPU per CUDA, e il resto per fare funzionare la CPU in parallelo. – harrism

risposta

7

No, non c'è alcun calo di prestazioni per i thread divergenti con OpenMP. È un problema in CUDA a causa del modo in cui le istruzioni vengono trasmesse simultaneamente a un insieme di core. Quando un thread OpenMP si rivolge a un core della CPU, ogni core CPU ha il proprio set indipendente di istruzioni da seguire, e funziona esattamente come qualsiasi altro programma a thread singolo.

È possibile che alcuni dei core vengano sottoutilizzati se si hanno barriere di sincronizzazione dopo la divergenza dei thread, poiché ciò imporrebbe i thread più veloci ad attendere che i thread più lenti raggiungano il limite.

+0

Grazie per la risposta! Primo post sullo stack overflow e ricevo due risposte in 10 minuti. Abbastanza bello. – Justin

3

Quando si parla di parallelismo della CPU, non è possibile ottenere risultati di prestazioni intrinseche dall'utilizzo di un determinato modello di progettazione di threading. Non a livello teorico almeno.

L'unico problema che vedo è che, poiché i fili stanno facendo cose diverse che possono essere diversi tempi di completamento, alcuni dei fili inattive dopo aver terminato il loro lavoro, in attesa che gli altri per finire un compito più lungo.

+0

Grazie per la risposta. – Justin

1

Il termine divergenza di thread in CUDA si riferisce alla situazione quando non tutti i thread di una bock valutano un condizionale con lo stesso risultato. Si dice che questi fili divergano. Se i fili divergenti si trovano nello stesso ordito, tali filettature potrebbero eseguire il lavoro in serie, il che comporta una perdita di prestazioni.

Non sono sicuro che OpenMP abbia lo stesso problema, comunque. Quando thread diversi eseguono lavori diversi, il bilanciamento del carico può essere utilizzato dal runtime, forse, ma non porta necessariamente alla serializzazione del lavoro.

1

non esiste questo tipo di problema in openmp perché ogni thread di apertura ha il proprio PC.