Core di una GPU: come funziona su una grafica

Una delle confusioni create dal marketing dei produttori di schede grafiche è quando si tratta di parlare del numero di core che un GPU ha, anticipiamo che mentono per esagerare i numeri. Ma cosa intendiamo per core in una GPU, possiamo confrontarli con quelli di un file CPU e quali differenze ci sono?

Quando vai a comprare l'ultima scheda grafica del modello, la prima cosa che vedi è che ti parlano di enormi quantità di core o processori, ma cosa succede se ti diciamo che è una nomenclatura sbagliata?

Core di una GPU: come funziona

La trappola che fanno i produttori è chiamare semplici ALU o unità di esecuzione con il nome di core, per esempio NVIDIA chiama i suoi core CUDA ALU che operano in virgola mobile a 32 bit, ma se siamo severi non possiamo più chiamarli core o processori. Non soddisfano i requisiti di base per essere considerati in questo modo.

Quindi cos'è un core o un processore in una GPU?

Ciclo Istruzione Unidad Control

Un core o processore è un qualsiasi circuito integrato o parte di esso che insieme può eseguire un ciclo completo di istruzioni, questa è l'acquisizione di istruzioni da una memoria, la decodifica e l'esecuzione di esse.

Un ALU è solo un'unità di esecuzione, quindi ha bisogno di un'unità di controllo per essere un nucleo completo. E cosa consideriamo un nucleo completo? Bene, quello che NVIDIA chiama SM, Intel chiama Sub-Slice e AMD Unità di calcolo.

La ragione di ciò è che è in queste unità che si svolge l'intero ciclo di istruzione, e non nelle ALU o unità di esecuzione, che sono responsabili solo di una parte del ciclo di istruzione.

Le GPU non "eseguono" programmi

GPU NVIDIA

Tieni presente che le GPU non eseguono i programmi come li conosciamo, trattandosi di una sequenza di istruzioni. L'eccezione sono i programmi shader che vengono eseguiti su quelli che sono effettivamente i core della GPU.

Ciò che fanno i programmi shader è manipolare set di dati o primitive grafiche nelle diverse fasi. Ma a livello di funzionalità hardware, questi sono presentati sotto forma di kernel.

I kernel, da non confondere con quelli dei sistemi operativi, sono dati autonomi + set di istruzioni, che sono anche chiamati thread nel contesto di una GPU.

In che modo un core GPU è diverso da un core CPU?

GPU della CPU

La differenza principale è questa Le CPU sono progettate principalmente per il parallelismo a livello di istruzione mentre la lavorazione del prodotto finito avviene negli stabilimenti del nostro partner Le GPU sono specializzate per il parallelismo a livello di thread.

Il parallelismo a livello di istruzione ha lo scopo di ridurre il tempo di istruzione di un programma eseguendo più istruzioni dello stesso contemporaneamente. I kernel basati sul parallelismo a livello di thread accettano diversi programmi contemporaneamente e li eseguono in parallelo ,

Le CPU contemporanee combinano ILP e TLP nelle loro architetture, mentre le GPU rimangono puramente TLP senza alcun ILP in modo da semplificare la centralina e poter posizionare quante più anime possibile.

Esecuzione su una GPU rispetto all'esecuzione su una CPU

Patatina dentro

Il più delle volte, quando un thread raggiunge le ALU core della GPU contiene l'istruzione e i dati direttamente, ma ci sono momenti in cui i dati devono essere cercati nelle cache e in memoria, per evitare ritardi nell'esecuzione dello scheduler del kernel della GPU quello che fa è quello che viene chiamato Round-Robin e passa quel thread per correre dopo.

In una CPU questo non può essere fatto, la ragione di ciò è che i thread sono insiemi di istruzioni molto complessi e con un'elevata dipendenza tra di loro, mentre in una GPU non ci sono problemi, poiché i thread di esecuzione sono estremamente piccoli in quanto sono autonomi nei "kernel" molte volte della durata di una singola istruzione.

In realtà, ciò che fanno le GPU è raccogliere un set di kernel in quella che viene chiamata un'onda, assegnando ogni onda a una ALU della GPU, questi vengono eseguiti in cascata e in ordine. Ogni kernel ha un limite di thread o kernel, che lo manterrà occupato per un po 'fino a quando non avrà bisogno di un nuovo elenco, evitando in questo modo che l'enorme numero di core continui a fare richieste alla memoria.