Definizione e utilizzo di "warp" nella programmazione parallela / GPU

0

Ho trovato la parola "curvatura" in alcuni punti ma non ho visto una definizione approfondita (non esiste neanche una pagina di Wikipedia).

Una breve definizione si trova qui :

In the SIMT paradigm, threads are automatically grouped into 32-wide bundles called warps. Warps are the base unit used to schedule both computation on Arithmetic and Logic Units (ALUs) and memory accesses. Threads within the same warp follow the SIMD pattern, i.e. they are supposed to execute the same operation at a given clock cycle...

Un'altra definizione si trova qui :

In a SIMT execution, some number of threads will be combined into a single group (called a “warp” in NVIDIA parlance, and a “wavefront” by AMD; for brevity, we will use the term “warp” hereafter). These threads will execute in lockstep, each executing the same instruction simultaneously.

Chiedendosi se è possibile descrivere più dettagliatamente quali sono esattamente gli orditi, e come dovresti usarli o pensarli quando esegui la programmazione in parallelo / GPU. Sembrano essere menzionati in relazione ad alcune ottimizzazioni. Un esempio è dal secondo link:

...efficiently mapping tree traversals on GPUs requires carefully scheduling those traversals so that traversals that are grouped together into the same warp are as similar as possible.

Poi più tardi:

The CPU then uses this information to dynamically reorder the traversals so that when the second kernel is called, threads grouped into warps perform similar work, improving SIMT efficiency.

Mi sto chiedendo quanti fili ci siano, dove siano, come usarli (come puoi usarli in WebGL attraverso qualche API, o è solo il modo in cui organizzi la memoria).

    
posta Lance Pollard 26.04.2018 - 00:46
fonte

1 risposta

2

SIMT sta per Single Thread multiplo di istruzioni. A differenza dei core su una CPU che (più o meno) agiscono indipendentemente l'uno dall'altro, ciascun core su una GPU esegue le stesse istruzioni, dallo stesso programma, di altri all'interno della GPU. Ma agiscono su dati diversi.

In un certo senso questo è abbastanza limitante. Ad esempio, se c'è un ramo nel codice, e alcuni core vogliono prendere il ramo e altri no, allora entrambi i rami saranno eseguiti ma i nuclei che non prendono il ramo corrente si fermeranno.

Tuttavia, ha il grande vantaggio di richiedere molti meno macchinari rispetto ai core indipendenti, in modo che i progettisti possano adattare più core sul chip in modo da poter eseguire più operazioni in parallelo.

Ora, non ha senso avere tutti i core eseguano la stessa istruzione. Molto tempo sarà speso in attesa di cose (principalmente accesso alla memoria) in modo che i progettisti li raggruppino. L'idea è che inizi a gestire un pacchetto. Se si blocca su accessi di memoria, lo si parcheggia ed esegue un altro pacchetto. Se quella bancarella e la memoria per il primo pacchetto sono ora disponibili, lo pianifichi. E così via.

Sui chip nVIDIA, questi bundle sono chiamati warp. Questo è un gioco di parole basato sull'idea di un curvatura nel settore tessile, essendo un fascio di fili in parallelo.

Il numero di thread in un warp è un po 'arbitrario. Verrà corretto per un chip (per ridurre i macchinari) e verrà scelto come bilanciamento tra le considerazioni di cui sopra. I chip più recenti / più costosi tendono ad avere più thread e quindi più distorsioni, poiché i produttori incastrano più core sul chip.

Per quanto riguarda il tuo punto di riferimento, le ottimizzazioni. Quello che stai cercando di ottenere è mantenere i core occupati. Idealmente, scriverete il vostro programma in modo che tutti i thread in un warp eseguano un'istruzione, cioè seguite gli stessi rami. In questo modo non si bloccano. Si desidera anche codificare codifica in modo tale che quando alcuni sono in attesa di memoria, altri possono essere programmati per eseguire le istruzioni. Questo è chiamato latency hiding.

In pratica, questo è un po 'una forma d'arte in quanto vi sono numerosi compromessi che differiscono da chip a chip.

Infine, per quanto riguarda il loro utilizzo. Se pianifichi un programma su una GPU, li userà semplicemente. Dato che il numero è fisso, non hai alcuna decisione da fare qui, quindi non ci sono API esplicite. L'unica volta che interagisci con loro è con le ottimizzazioni sopra.

    
risposta data 26.04.2018 - 11:14
fonte

Leggi altre domande sui tag