OpenCL nel Trading - pagina 6

 

16. Esempio OpenCL: rotazione dell'immagine



16. Esempio OpenCL: rotazione dell'immagine

Questo video illustra la rotazione dell'immagine e come può essere implementata utilizzando OpenCL. Ogni pixel in un'immagine ha coordinate e rappresenta una scala di colori specifica e la rotazione comporta lo spostamento dei pixel in una nuova posizione in base a una formula che tiene conto delle loro coordinate originali e nuove e dell'angolo di rotazione. Il relatore propone di assegnare a ciascun elemento di lavoro il calcolo della nuova posizione di un singolo pixel e utilizza la scomposizione dell'input per dividere l'intero spazio di lavoro globale in gruppi di lavoro più piccoli, rendendo l'operazione più efficiente. Viene inoltre spiegato il processo di trasferimento di un'immagine dal buffer sul dispositivo al buffer sull'host, con particolare attenzione al controllo degli errori e al calcolo del tempo trascorso.

  • 00:00:00 In questa sezione, il video discute la rotazione dell'immagine e la matematica dietro di essa. Spiega che ogni pixel in un'immagine ha coordinate e rappresenta una scala di colori specifica. La rotazione comporta lo spostamento dei pixel in una nuova posizione in base a una formula che tiene conto delle loro coordinate originali e nuove e dell'angolo di rotazione. Il video propone di assegnare ogni elemento di lavoro per calcolare la nuova posizione di un singolo pixel e utilizza la scomposizione dell'input per dividere l'intero spazio di lavoro globale in gruppi di lavoro più piccoli, rendendo l'operazione più efficiente.

  • 00:05:00 In questa sezione, il relatore spiega come l'immagine è suddivisa in gruppi di lavoro in OpenCL per implementare la rotazione dell'immagine. L'immagine è suddivisa in domini orizzontali e verticali, ciascuno con 16 gruppi di lavoro assumendo che la larghezza e l'altezza dell'immagine siano multipli di 16. e dati di destinazione, dimensioni dell'immagine e parametri di rotazione. All'interno della funzione kernel, il relatore illustra come viene calcolata la nuova posizione di ciascun pixel utilizzando i parametri di rotazione e come il contenuto dei pixel viene copiato dalla posizione originale alla nuova posizione dopo aver eseguito il controllo dei confini.

  • 00:10:00 In questa sezione, il relatore spiega come ruotare un'immagine utilizzando OpenCL. Il processo prevede il controllo delle coordinate e la garanzia che siano valori positivi all'interno delle dimensioni dell'immagine. Le informazioni sui pixel vengono quindi copiate dalla posizione originale alla nuova posizione utilizzando calcoli per determinare la posizione di memoria fisica. Il codice di esempio elencato in questa sezione mostra le differenze tra questa implementazione e quella precedente della moltiplicazione di matrici. L'associazione C++ per l'API OpenCL viene utilizzata per configurare l'ambiente per interrogare le piattaforme, acquisire il dispositivo, creare una coda di comando e dichiarare i buffer per lo spostamento dei dati. Il kernel viene compilato ei parametri vengono impostati per eseguire il kernel, che viene completato leggendo i risultati all'host.

  • 00:15:00 In questa sezione, l'oratore discute il processo di trasferimento di un'immagine dal buffer sul dispositivo al buffer sull'host. L'oratore spiega che questo processo comporta la lettura del buffer sul dispositivo utilizzando la funzione clEnqueueReadBuffer e specificando la dimensione, l'offset e il puntatore al buffer sull'host. Inoltre, il relatore rileva l'importanza di verificare la presenza di errori durante questo processo utilizzando un'istruzione if e dimostra come calcolare il tempo trascorso per questa parte del codice utilizzando la funzione clGetEventProfilingInfo.
OpenCL Example: Image Rotation
OpenCL Example: Image Rotation
  • 2020.06.05
  • www.youtube.com
This video explains the math behind the image rotation and the code implementation.
 

17. Demo di rotazione delle immagini di esempio OpenCL



17. Demo di rotazione delle immagini di esempio OpenCL

Il tutorial "OpenCL Example Image Rotation Demo" copre il codice sorgente della demo, che include diverse cartelle contenenti codice C e file immagine che il programma elaborerà. Il video illustra la creazione di buffer per le immagini di input e output, la copia dell'immagine originale nel buffer del dispositivo, l'impostazione degli argomenti del kernel, l'esecuzione del kernel con una dimensione globale definita come l'intera immagine e la lettura dei dati di output nell'host. La funzione del kernel utilizza i parametri di rotazione per calcolare le nuove coordinate di ciascun pixel e copiare le informazioni sui pixel nella nuova posizione con il controllo dei confini. Il programma include anche una funzione per memorizzare l'immagine ruotata in formato BMP e libera tutte le risorse dopo il completamento. La demo legge e calcola correttamente i pixel dell'immagine originale per creare l'immagine ruotata.

  • 00:00:00 In questa sezione, il presentatore fornisce una panoramica del codice sorgente per la demo di rotazione dell'immagine che include diverse cartelle contenenti i file di codice C principali e di supporto, nonché i file di immagine che il programma elaborerà. Il codice include file di intestazione per piattaforme Mac OS e Altera OpenCL, definizioni per buffer e parametri del kernel e utilizza funzioni di supporto per l'apertura di file immagine e la conversione dei relativi formati. Il codice include anche la creazione del buffer di output e l'inizializzazione con numeri casuali. Infine, il codice crea una coda di comando, un oggetto programma e un oggetto kernel e specifica il nome della funzione del kernel.

  • 00:05:00 In questa sezione, l'oratore illustra il processo di creazione di buffer per immagini di input e output, copia dell'immagine originale nel buffer del dispositivo, impostazione degli argomenti del kernel, esecuzione del kernel con una dimensione globale definita come l'intera immagine, e leggendo i dati di output all'host. La funzione del kernel accetta i puntatori del buffer di destinazione e di origine, le dimensioni dell'immagine e i parametri di rotazione per calcolare le nuove coordinate di ciascun pixel e copiare le informazioni sui pixel nella nuova posizione con il controllo dei confini. Il programma include anche una funzione per memorizzare l'immagine ruotata in formato BMP e libera tutte le risorse dopo il completamento.

  • 00:10:00 In questa sezione, il relatore mostra una demo di rotazione dell'immagine di esempio OpenCL utilizzando la piattaforma Avatar FPGA che prende l'immagine originale di un gatto e la ruota in senso orario di 45 gradi, producendo una nuova immagine della stessa dimensione che viene salvata con un nuovo nome nella cartella di rotazione delle immagini. La demo mostra che legge e calcola correttamente i pixel dell'immagine originale per creare l'immagine ruotata.
OpenCL Example Image Rotation Demo
OpenCL Example Image Rotation Demo
  • 2020.06.05
  • www.youtube.com
This video walks through the code of Image Rotation and demonstrates the results.
 

18. Esempio OpenCL: Convoluzione immagine



18. Esempio OpenCL: Convoluzione immagine

Il video "OpenCL Example: Image Convolution" spiega la convoluzione dell'immagine, che modifica ogni pixel in un'immagine utilizzando le informazioni dai pixel vicini applicando un filtro come un filtro di sfocatura. Il video fornisce un'implementazione iniziale della funzione di convoluzione dell'immagine e introduce la struttura dei dati "immagine" in OpenCL, progettata per i tipi di dati immagine, consentendo un'elaborazione efficiente sui processori grafici. Il video mostra come copiare l'immagine e filtrare i dati sul dispositivo per il lavoro di convoluzione dell'immagine utilizzando OpenCL e l'uso dell'oggetto campionatore OpenCL per accedere all'immagine. Il video mostra anche come ottenere l'elemento di lavoro e scorrere le righe e le colonne del filtro per ottenere informazioni sui pixel dall'oggetto immagine, moltiplicarle per i pixel del filtro e accumularle nella variabile somma. Infine, il video mostra come aggiornare i valori dei pixel utilizzando un oggetto immagine OpenCL.

  • 00:00:00 In questa sezione, il video discute la convoluzione dell'immagine, che è un'operazione che modifica il valore di ciascun pixel in un'immagine utilizzando le informazioni dei pixel vicini. Questo viene fatto applicando un filtro all'immagine originale, come un filtro di sfocatura, che prende una media ponderata di pixel vicini per ridurre le differenze tra i loro valori. Il video mostra come applicare un filtro 3x3 a una piccola regione di un'immagine e utilizzare la moltiplicazione e la somma per elemento per calcolare il valore di ogni nuovo pixel nell'immagine filtrata. Tuttavia, il video rileva che quando si applicano tali operazioni di filtraggio a un'intera immagine, è necessario prestare particolare attenzione ai pixel di contorno che non hanno tutti gli otto pixel vicini. Il video mostra anche diversi filtri di esempio, come la sfocatura e il rilevamento dei bordi, che possono essere applicati a un'immagine per ottenere effetti diversi.

  • 00:05:00 In questa sezione del video "Esempio OpenCL: Image Convolution", il relatore fornisce un'implementazione seed della funzione di convoluzione dell'immagine che passa attraverso ogni pixel di un'immagine e vi applica un filtro. Introducono anche una nuova struttura dati in OpenCL chiamata "immagine" che è specificamente progettata per i tipi di dati immagine, consentendo lunghe sequenze di istruzioni che possono essere elaborate in modo più efficiente sui processori grafici. Gli oggetti immagine possono essere creati con formati, dimensioni e altri parametri specificati. Il video mostra come creare un buffer di immagini 2D sul lato del dispositivo.

  • La sezione 00:10:00 illustra il processo di copia dei dati dell'immagine e del filtro nel dispositivo per il lavoro di convoluzione dell'immagine utilizzando OpenCL. La sezione introduce anche l'oggetto campionatore OpenCL che viene utilizzato per descrivere come accedere a un'immagine. La modalità di indirizzamento, la modalità di filtraggio e l'uso delle coordinate normalizzate sono specificate per l'oggetto sampler. La sezione mostra anche la funzione del kernel e l'uso delle parole chiave "sola lettura" e "costante" per specificare le proprietà dell'oggetto, che consente al runtime OpenCL di inserire gli oggetti filtro nella regione costante specifica nella memoria globale.

  • 00:15:00 In questa sezione dell'esempio di convoluzione dell'immagine OpenCL, l'oratore esegue i passaggi per ottenere l'elemento di lavoro utilizzando get_global_id, calcolando la metà larghezza del filtro, inizializzando l'indice del filtro, iterando le righe e le colonne del filtro e utilizzando la funzione read_image per ottenere le informazioni sui pixel dall'oggetto immagine. Le informazioni sui pixel vengono quindi moltiplicate con il pixel nel filtro e accumulate nella variabile somma. Questo processo viene ripetuto per ogni pixel nel filtro e consente l'utilizzo delle informazioni sui pixel vicini nella convoluzione dell'immagine.

  • 00:20:00 In questa sezione, l'esercitazione video mostra come aggiornare i valori dei pixel in una convoluzione dell'immagine OpenCL utilizzando un oggetto immagine. Dopo aver eseguito correttamente il kernel, il passaggio successivo consiste nell'usare CL in Q read image per rileggere l'immagine. Questa funzione accetta il comando Q come primo argomento, l'oggetto immagine di output e un valore true per indicare che la lettura deve essere bloccata fino al completamento. Vengono forniti i parametri di origine e regione utilizzati per creare l'oggetto immagine, insieme al buffer sul lato host in cui sono archiviati i dati dell'immagine.
OpenCL Example: Image Convolution
OpenCL Example: Image Convolution
  • 2020.06.07
  • www.youtube.com
This video introduces the principles of image convolution and how to implement it in OpenCL.
 

19. Demo: Esempio OpenCL - Convoluzione immagine



19. Demo: Esempio OpenCL - Convoluzione immagine

Il video spiega un esempio di convoluzione dell'immagine OpenCL, definendo diversi filtri come sfocatura, nitidezza, nitidezza dei bordi, rilevamento e filtro di inclusione. Il relatore dimostra l'inizializzazione dei valori del filtro e la lettura dei dati immagine BMP dal file, la creazione di oggetti immagine di input e output e l'impostazione degli argomenti del kernel per eseguire il kernel. Il video insegna anche a creare il campionatore, definire come elaborare i pixel al di fuori del confine, avviare il kernel, memorizzare i dati dei pixel in un file e creare le intestazioni necessarie per il formato BMP. Infine, verificare i risultati confrontando i valori in due buffer per creare un'immagine filtrata che dovrebbe corrispondere al risultato aureo con solo una leggera deviazione dovuta al calcolo mobile.

  • 00:00:00 In questa sezione del video, il relatore esamina il codice di un esempio di convoluzione di un'immagine OpenCL. Il codice definisce diversi filtri, tra cui sfocatura, nitidezza, nitidezza bordi, rilevamento e abbraccio. Il relatore mostra come testare un filtro specifico, in questo caso il filtro di rilevamento dei bordi. Spiegano anche come inizializzare i valori del filtro e leggere i dati dell'immagine BMP dal file, creare gli oggetti immagine di input e output e impostare gli argomenti del kernel per eseguire il kernel. Il video illustra anche come creare il campionatore e definire come elaborare i pixel che non rientrano nel limite.

  • 00:05:00 In questa sezione, il relatore mostra un esempio di convoluzione dell'immagine utilizzando OpenCL. La presentazione mostra i passaggi necessari per eseguire il filtro sull'host, inclusi l'avvio del kernel, l'archiviazione dei dati dei pixel in un file e la creazione delle intestazioni necessarie per il formato BMP e la verifica dei risultati confrontando i valori in due buffer. L'obiettivo di questo esercizio è creare un'immagine filtrata che dovrebbe corrispondere al risultato aureo con solo una leggera deviazione dovuta al calcolo mobile. Nel complesso, la presentazione sottolinea come compilare, eseguire e verificare l'output dalla funzione del kernel OpenCL.
Demo: OpenCL Example - Image Convolution
Demo: OpenCL Example - Image Convolution
  • 2020.06.07
  • www.youtube.com
This demonstrates the example of Image Convolution.
 

20. Lezione 5 OpenCL Concurrency Model



20. Lezione 5 OpenCL Concurrency Model

Questa lezione copre il runtime e il modello di concorrenza OpenCL, incluse più code di comandi, modello di accodamento, elementi di lavoro dei kernel OpenCL e gruppi di lavoro. I punti di sincronizzazione vengono utilizzati per gestire l'esecuzione dei comandi e gli eventi di attesa vengono utilizzati per sincronizzare i comandi in una coda di comandi lato dispositivo. La lezione sottolinea l'importanza delle operazioni asincrone in OpenCL e spiega l'uso degli eventi per specificare le dipendenze tra i comandi. Il docente discute anche l'uso delle funzioni di callback per il completamento degli eventi e sottolinea l'importanza della profilazione per l'ottimizzazione delle prestazioni. Inoltre, la lezione copre il modello di concorrenza OpenCL per più dispositivi in un sistema, inclusi i modelli di pipeline e di esecuzione parallela. Infine, il docente dimostra l'implementazione di un modello di esecuzione utilizzando gli eventi del kernel, che consente l'esecuzione parallela di diversi kernel.

Il modello di concorrenza OpenCL consente l'esecuzione indipendente di più elementi di lavoro per migliorare le prestazioni, utilizzando gruppi di lavoro con sincronizzazione locale per ottenere il parallelismo nell'esecuzione, ma troppi elementi di lavoro possono causare conflitti di risorse. Gli elementi di lavoro sono responsabili della gestione dei propri contatori di programma e la comprensione delle dimensioni e delle dimensioni del problema è importante per progettare elementi di lavoro che sfruttano gli elementi di elaborazione della GPU. OpenCL utilizza le barriere dei gruppi di lavoro per la sincronizzazione avanzata tra elementi di lavoro, ma nessun meccanismo supporta la sincronizzazione tra elementi di lavoro in diversi gruppi di lavoro della stessa esecuzione del kernel. Per sincronizzare gli elementi di lavoro all'interno dello stesso gruppo di lavoro, viene utilizzata l'API barriera, ma per la sincronizzazione su scala globale vengono utilizzati gli eventi e gli eventi di attesa. La funzione del kernel utilizza i puntatori agli oggetti di memoria nelle memorie globali e locali e la memoria locale accessibile a tutti gli elementi di elaborazione può essere utilizzata per la condivisione dei dati all'interno del gruppo di lavoro. La lezione copre anche i kernel nativi, che consentono di utilizzare le funzioni C come kernel su un dispositivo senza fare affidamento sui compilatori OpenCL, il passaggio di oggetti di memoria OpenCL a una funzione utente utilizzando l'API del kernel nativo in coda e le funzioni del kernel integrate, come il estensione di stima del movimento per OpenCL, utilizzata per l'elaborazione delle immagini per stimare il movimento tra fotogrammi vicini in un video.

  • 00:00:00 In questa sezione, apprendiamo il runtime e il modello di concorrenza OpenCL, inclusi i comandi OpenCL, il modello di accodamento, le code di comandi multipli, gli elementi di lavoro dei kernel OpenCL e i gruppi di lavoro. OpenCL è un modello controllato da host parallelo di attività e i kernel vengono utilizzati per eseguire attività parallele. Le code di comando sono thread-safe, in quanto più thread software possono essere in esecuzione su un host e possono o meno operare sulla stessa coda di comando. Le operazioni asincrone sono importanti in OpenCL e lo spostamento dei dati e altre operazioni vengono eseguite nella coda in un momento futuro. L'unità più piccola che gli host interagiscono con il dispositivo è il comando e il completamento di un comando è garantito solo in un punto di sincronizzazione della coda di comando. Questa sincronizzazione avviene tra i comandi in una coda di concessione host e tra i comandi in una coda di comandi lato dispositivo.

  • 00:05:00 In questa sezione, la lezione si concentra sull'argomento di blocco della lettura in QAPI e su come può essere utilizzato per impostare un punto di sincronizzazione. Impostando il blocco della lettura su true, questa API può essere trasformata in un'operazione di lettura del blocco, che interromperà altre operazioni di memoria fino al completamento dell'operazione di lettura. La lezione spiega anche l'uso degli eventi in QAPI per specificare le dipendenze tra i comandi, che possono essere utili in operazioni complesse che coinvolgono più comandi, trasferimenti di dati e calcoli. Inoltre, gli eventi possono fornire più informazioni su un comando rispetto al comando stesso, poiché i comandi inviati utilizzando Co in coda vengono gestiti in modo asincrono e non possono restituire condizioni di errore o dati di profilazione. Tuttavia, generando un evento associato a un comando, è possibile richiedere informazioni sul comando utilizzando l'API CL get event info.

  • 00:10:00 In questa sezione viene discusso il modello di concorrenza OpenCL, in particolare l'uso dei punti di sincronizzazione per gestire l'esecuzione dei comandi. Un modo per sincronizzare è l'uso di eventi di attesa, in cui l'host può bloccare fino a quando non si verifica un evento specifico, mentre l'API della coda ha diversi eventi di attesa per la sincronizzazione tra comandi. L'operazione barriera, invece, è un comando speciale utilizzato per le code fuori ordine, dove diventa un punto di sincronizzazione. I marcatori hanno uno scopo simile ma non bloccano l'esecuzione, ma fungono invece da evento di input implicito, con eventi di output per notificare lo stato di completamento dei comandi precedenti. Altre informazioni su un comando, come le sue condizioni di errore, possono essere interrogate utilizzando l'API CIL get event info.

  • 00:15:00 In questa sezione, il docente discute le API di comando ed evento di OpenCL, che vengono utilizzate per controllare il flusso di dati tra host e dispositivo. Spiega che l'API dei comandi consente agli utenti di inviare comandi alla coda dei comandi, che può eseguire varie operazioni come esecuzioni del kernel, letture e scritture del buffer e mappature della memoria. Utilizzando l'API degli eventi, gli utenti possono interrogare lo stato di esecuzione del comando inviato e applicare la profilazione all'interno del contesto. Il docente parla anche della funzione di callback dell'evento, che viene attivata quando si verifica lo stato di esecuzione specifico di un comando in una coda. La funzione di callback può essere utilizzata per eseguire attività semplici e fornire dati di output che l'applicazione OpenCL può sfruttare. Il docente sottolinea che la funzione di richiamata dovrebbe essere completata il più rapidamente possibile e non dovrebbe essere una funzione di blocco.

  • 00:20:00 In questa sezione, l'oratore discute l'impostazione delle funzioni di callback per gestire il completamento dell'evento. L'impostazione della funzione di callback subito dopo aver dichiarato un evento di completamento non è una posizione valida poiché non esiste ancora alcun comando associato all'evento. Un evento valido viene creato solo dopo che un comando è stato associato ad esso, ad esempio quando un kernel viene aggiunto alla coda dei comandi. Le funzioni di callback dovrebbero essere thread-safe, veloci da completare e non chiamare costose routine di sistema. È anche importante abilitare la profilazione quando si tratta di ottimizzare le prestazioni, poiché aiuta a determinare lo stato e l'ora di esecuzione di un comando. Il flag di abilitazione del profilo clq viene utilizzato per abilitare il profilo.

  • 00:25:00 In questa sezione, il relatore discute l'API di profilazione OpenCL, che consente agli utenti di ottenere informazioni sugli eventi in coda. Abilitando la profilatura, un cue può fornire informazioni come l'ora di inizio e di fine per i comandi, che possono essere utilizzate per calcolare il tempo di esecuzione. L'oratore spiega anche gli eventi dell'utente, che non sono associati a un comando specifico e possono essere utilizzati in modo arbitrario. Creando un evento utente e facendo attendere un comando di lettura, l'operazione di lettura si bloccherà fino al completamento dell'evento utente, consentendo un controllo più specifico sull'ordine dei comandi.

  • 00:30:00 In questa sezione, il relatore spiega come controllare l'ordine di esecuzione dei comandi e come ottenere prestazioni migliori utilizzando una coda fuori servizio. Per impostazione predefinita, i comandi in una coda comandi vengono eseguiti in ordine, ma per ottenere flessibilità e prestazioni migliori è possibile utilizzare una coda fuori ordine. Il relatore mostra un esempio concreto di impostazione di una coda fuori servizio con più eventi e oggetti buffer. L'esempio include un'operazione di scrittura e un'operazione di lettura con buffer non bloccanti, di sola scrittura e di sola lettura. Vengono discussi anche gli eventi utente e lo stato dell'evento. Nel complesso, la sezione fornisce una comprensione completa per la creazione di una coda fuori servizio e l'ottimizzazione dell'ordine di esecuzione dei comandi per prestazioni migliori.

  • 00:35:00 In questa sezione, il docente spiega come copiare numeri in virgola mobile dal buffer di input dell'host al buffer di memoria del dispositivo utilizzando l'API OpenCL. Il codice include l'impostazione della dimensione dell'unità di esecuzione, l'avvio di due funzioni del kernel e l'attesa degli eventi di completamento. La conferenza sottolinea inoltre che le due funzioni del kernel sono comandi separati e mostra come leggere i dati di output sul lato host, attendere eventi ed eseguire la pulizia. Nel complesso, la sezione illustra l'uso di quattro comandi OpenCL per copiare ed elaborare i dati tra un host e un dispositivo.

  • 00:40:00 In questa sezione, vediamo come le code di comando e gli eventi controllano l'esecuzione dei comandi OpenCL. Impostando le dipendenze utilizzando gli eventi, possiamo garantire che i comandi vengano eseguiti in un ordine specifico. Tuttavia, se invertiamo l'ordine dei comandi in una coda fuori ordine, ciò non influirà sull'esecuzione dei comandi. Ma se usiamo una coda in ordine e scambiamo i comandi, può portare a un deadlock.
    Pertanto, è fondamentale configurare correttamente le dipendenze e utilizzare il tipo di coda appropriato per evitare potenziali problemi. Inoltre, apprendiamo più code di comando e come possono essere utilizzate per migliorare la concorrenza nei programmi OpenCL.

  • 00:45:00 In questa sezione, il docente spiega il modello di concorrenza OpenCL per più dispositivi in un sistema. Ogni dispositivo ha bisogno della propria coda di comando ed è anche possibile avere più code di comando per un singolo dispositivo, ma non è comunemente usato. In genere, più dispositivi che utilizzano OpenCL utilizzano due diversi modelli di esecuzione: pipeline o in parallelo. Nel modello pipeline, anche se sono presenti due o più dispositivi, un dispositivo attende il risultato da un altro dispositivo, formando una pipeline. D'altra parte, nel modello parallelo, i dispositivi lavorano indipendentemente in parallelo con i loro buffer, eseguendo indipendentemente. La lezione include anche un esempio di più code di comando in un contesto sulla piattaforma OpenCL, due dispositivi con le proprie code di comando e un'implementazione in OpenCL.

  • 00:50:00 In questa sezione, apprendiamo la pipeline e i modelli di esecuzione parallela in OpenCL. Nel modello pipeline, i dati vengono condivisi tra due kernel, con il kernel 0 in esecuzione per primo e il kernel 1 in attesa del completamento prima di passare al calcolo successivo. Vediamo l'implementazione di questo modello utilizzando eventi e chiamate API. Al contrario, il modello parallelo viene utilizzato quando non ci sono dipendenze tra le attività e i kernel possono essere eseguiti contemporaneamente su dispositivi diversi. L'esempio fornito ha tre dispositivi, i dispositivi GPU 0 e 1 e un dispositivo CPU 2, con code di comando separate per ciascuno. Il kernel 0 e il kernel 1 vengono lanciati separatamente per essere eseguiti in parallelo e, una volta completato, può essere avviato il kernel 2 della CPU.

  • 00:55:00 In questa sezione, il relatore discute come costruire un modello di esecuzione in OpenCL creando un evento del kernel, che consente l'esecuzione parallela di diversi kernel. Le prime due chiamate API vengono utilizzate per creare due code GPU separate per il colonnello 0 e il colonnello 1. Quindi, la terza chiamata API avvia un kernel della CPU, che attende il completamento di entrambi i kernel della GPU prima dell'esecuzione. L'approccio discusso utilizza gli eventi per generare dipendenze tra i kernel della CPU e della GPU, ma consente anche l'esecuzione in parallelo dei kernel della GPU. Il relatore spiega anche i concetti di elementi di lavoro OpenCL, che definiscono una copia o un'istanza di calcolo, e gli elementi di elaborazione, che sono l'unità più piccola su un dispositivo hardware.

  • 01:00:00 In questa sezione viene spiegato il modello di concorrenza OpenCL, che si basa sulla possibilità di eseguire più elementi di lavoro in modo indipendente per aumentare le prestazioni. I gruppi di lavoro sono un insieme di elementi di lavoro in uno spazio di esecuzione globale che sono mappati alle unità di calcolo, consentendo la sincronizzazione locale come un modo per ottenere un certo grado di parallelismo nell'esecuzione. Tuttavia, il mapping di troppi elementi di lavoro a un'unità di calcolo può causare conflitti di risorse, che richiedono l'emissione di un lavoro appena sufficiente per mantenere tutti gli elementi di elaborazione sempre occupati e completare i gruppi di lavoro in un unico batch.

  • 01:05:00 In questa sezione del video, il relatore discute il modello di concorrenza OpenCL e come gli elementi di lavoro possono essere raggruppati in thread o contesti hardware. Gli elementi di lavoro sono responsabili della gestione dei propri contatori di programma durante la mappatura degli elementi di lavoro e l'invio dal framework OpenCL. L'oratore spiega che gli elementi di lavoro dovrebbero essere progettati per soddisfare e sfruttare gli elementi di elaborazione della GPU. Le dimensioni della dimensione del problema e l'elemento corrente su cui si sta lavorando sono importanti da capire. L'altoparlante fornisce una serie di funzioni integrate che possono essere utilizzate per comprendere le dimensioni del problema, la dimensione globale, la dimensione locale e, cosa più importante, per ottenere l'ID globale e locale come indice per scoprire qual è l'elemento di dati effettivo che deve essere lavorato nell'elemento di lavoro corrente. Viene fornito anche un semplice esempio di kernel per spiegare i diversi aspetti del modello di concorrenza OpenCL.

  • 01:10:00 In questa sezione, il docente spiega una funzione del kernel che calcola l'indirizzo da utilizzare con il metodo get global ID per ottenere il numero ID in uno spazio globale per il calcolo. La funzione del kernel utilizza quindi l'indirizzo come indice di un array, moltiplica il risultato per due e assegna il prodotto a un buffer diverso. Il docente prosegue spiegando come l'ID globale nella dimensione zero viene utilizzato per determinare l'elemento su cui calcolare e come l'ID globale nella dimensione uno aiuta a determinare quante righe sono state passate finora. L'idea è garantire che ogni elemento di lavoro calcoli su un elemento univoco e che non vi siano ripetizioni di calcoli su alcun elemento, risparmiando così sui cicli della GPU o della CPU.

  • 01:15:00 In questa sezione, il video illustra come funziona la sincronizzazione OpenCL e perché può essere difficile garantire l'ordinamento basato sull'hardware. OpenCL è un framework API multipiattaforma che non sa dove verrà eseguito il programma, quindi non può garantire l'ordinamento basato sull'hardware. OpenCL funziona su dispositivi che possono supportare il multi-threading, ma non esiste un sistema operativo in esecuzione separatamente su tali dispositivi. Ciò significa che non esiste un master o un kernel del sistema operativo per rimuovere i thread da una coda di esecuzione. Di conseguenza, esiste il rischio di deadlock quando si utilizzano semafori o meccanismi simili. Per eseguire la sincronizzazione avanzata tra elementi di lavoro, OpenCL utilizza una barriera del gruppo di lavoro. Tuttavia, OpenCL non dispone di meccanismi per supportare la sincronizzazione tra elementi di lavoro in diversi gruppi di lavoro della stessa esecuzione del kernel. Per supportare la condivisione dei dati all'interno del gruppo di lavoro o sullo stesso computer, è possibile utilizzare la memoria locale accessibile a tutti gli elementi di elaborazione.

  • 01:20:00 In questa sezione impareremo a utilizzare l'operazione barriera per sincronizzare gli elementi di lavoro all'interno dello stesso gruppo di lavoro in OpenCL. L'API barriera viene utilizzata come punto di sincronizzazione e gli elementi di lavoro non possono continuare oltre la barriera finché anche tutti gli altri elementi di lavoro nel gruppo di lavoro non hanno raggiunto la barriera. Ciò garantisce che tutti gli elementi di lavoro nel gruppo dispongano degli stessi dati prima di procedere. Utilizzando la linea di sincronizzazione globale in OpenCL, è possibile utilizzare l'evento e l'evento di attesa per la sincronizzazione su scala globale, ma all'interno del gruppo di lavoro a livello di elementi di lavoro, è necessario sfruttare l'operazione barriera per eseguire la sincronizzazione.

  • 01:25:00 In questa sezione, apprendiamo la funzione del kernel in OpenCL e i suoi argomenti, che sono puntatori a oggetti di memoria nelle memorie globali e locali. La memoria locale è presente all'interno di un'unità di calcolo ed è condivisa dagli elementi di elaborazione in tale unità di calcolo. La funzione del kernel utilizza l'ID globale e l'ID locale per leggere i dati dalla memoria globale e assegnarli all'elemento corrispondente in un buffer locale. Per sincronizzare tutti gli elementi di lavoro che lavorano sulla stessa dichiarazione di assegnazione, la barriera del gruppo di lavoro e l'offesa della memoria locale vengono utilizzate come punti di sincronizzazione. Dopo la sincronizzazione, la funzione kernel esegue operazioni sui dati nel buffer locale e memorizza il risultato nella posizione corrispondente nel buffer di output nella memoria globale.

  • 01:30:00 In questa sezione, la lezione introduce il concetto di kernel nativi in OpenCL, che consente di utilizzare le funzioni C come kernel su un dispositivo senza fare affidamento sui compilatori OpenCL. L'API per invocare i kernel nativi è presentata insieme al meccanismo per passare argomenti alla funzione C usando uno schema chiamato "unboxing". La lezione fornisce un esempio di passaggio di argomenti, che implica il passaggio di numeri costanti e puntatori a oggetti di memoria, inclusi i buffer OpenCL, recuperati dall'ambiente OpenCL.

  • 01:35:00 In questa sezione, il docente spiega come passare oggetti di memoria OpenCL a una funzione utente utilizzando l'API del kernel nativo in coda. L'API richiede che il numero di oggetti di memoria passati e le rispettive posizioni siano specificati in un elenco. Ciò include segnaposto per oggetti di memoria e numeri costanti, che sono differenziati dagli oggetti di memoria perché richiedono passaggi interattivi. I kernel integrati sono specifici del dispositivo e sfruttano risorse hardware speciali, ma non sono universali e potrebbero non avere la stessa funzione su dispositivi diversi.

  • 01:40:00 In questa sezione, apprendiamo le funzioni del kernel integrate, come l'estensione interna per la stima del movimento per OpenCL, che viene utilizzata per l'elaborazione delle immagini per stimare il movimento tra fotogrammi vicini in un video. Questa estensione fornisce funzionalità di accelerazione hardware o firmware incorporato e può essere esplorata ulteriormente sul sito Web di OpenCL.
Lecture 5 OpenCL Concurrency Model
Lecture 5 OpenCL Concurrency Model
  • 2018.10.13
  • www.youtube.com
OpenCL Runtime and Concurrency Model (please refer to Chapter 5 of textbook)
 

21. Concetto di riduzione della mappa



21. Concetto di riduzione della mappa

Il concetto di MapReduce è spiegato in questo video, che prevede la suddivisione di problemi di grandi dimensioni in sottoproblemi più piccoli utilizzando una fase di mappatura seguita da una fase di riduzione. Questo approccio viene utilizzato da Google per elaborare grandi quantità di dati sui propri computer nei data center. Il video fornisce un esempio di come i processori operano in modo indipendente, assegnando ai processori alcuni dati su cui lavorare, il che produce coppie chiave-valore al completamento. Le coppie chiave-valore vengono quindi elaborate da un gruppo di processori diversi per ottenere il risultato finale nella fase di riduzione. Questo approccio consente un'elaborazione efficiente di set di dati di grandi dimensioni distribuendo il carico di lavoro su più macchine.

  • 00:00:00 In questa sezione, il relatore discute il concetto di MapReduce nel contesto della scomposizione di grandi problemi per ottenerne di più piccoli che possono essere affrontati in modo efficiente. Identificano due strategie principali per la scomposizione, ovvero divide et impera e scatter e raccogli, che vengono utilizzate in modo intercambiabile a seconda delle proprietà del problema o delle limitazioni hardware. Spiegano che l'approccio MapReduce, proposto per la prima volta da Google nel 2004, suddivide i problemi di grandi dimensioni in sottoproblemi più piccoli e li elabora individualmente utilizzando una fase di mappatura seguita da una fase di riduzione. Illustrano come il concetto viene utilizzato da Google per elaborare grandi quantità di dati sui propri computer nei data center, che servono query dei motori di ricerca e pagine web.

  • 00:05:00 In questa sezione, l'approccio MapReduce è spiegato attraverso due fasi: mappatura e riduzione. La prima fase prevede l'assegnazione ai processori di alcuni dati su cui lavorare, il che comporterà la produzione di coppie chiave-valore al completamento. La seconda fase, nota come riduzione, prevede che i processori ricevano coppie chiave-valore dalla prima fase ed eseguano la riduzione sui valori corrispondenti a una data "T". Questo approccio è efficiente poiché i processori possono operare in modo indipendente una volta che il problema originale è stato suddiviso in sottoproblemi, rendendolo scalabile a problemi di dimensioni diverse. Il video fornisce un esempio concreto di come questo approccio può essere applicato utilizzando un input con sei blocchi assegnati ai processori, illustrando la potenziale efficienza di questo approccio.

  • 00:10:00 In questa sezione viene fornito il concetto di riduzione della mappa e viene spiegato come i processori eseguono l'addizione per combinare l'input originale in sei parti di uguali dimensioni per garantire l'equilibrio. Ogni coppia chiave-valore viene prodotta quasi contemporaneamente durante il processo di mappatura da diversi processori. La fase successiva include l'elaborazione di queste coppie di valori chiave da parte di un gruppo di processori diversi per ottenere il risultato finale. Infine, la fase di riduzione combina queste coppie di valori chiave e i processori creano l'elenco di alcuni collegamenti in base al valore di una singola parola chiave.

  • 00:15:00 In questa sezione, il relatore spiega il processo di mappatura in MapReduce, che prevede la suddivisione delle attività in attività secondarie più piccole che possono essere eseguite in parallelo. Questo viene fatto creando un elenco per ogni parola chiave che deve essere analizzata, con ogni elemento nell'elenco che rappresenta un valore associato a quella parola chiave. Ciò consente un'elaborazione efficiente di set di dati di grandi dimensioni distribuendo il carico di lavoro su più macchine.
Map Reduce Concept
Map Reduce Concept
  • 2020.06.14
  • www.youtube.com
This video introduce the basic concept of MapReduce
 

22. Map Reduce Esempio: WordCount e Weblink



22. Map Reduce Esempio: WordCount e Weblink

Questo video di YouTube mostra come MapReduce può essere applicato per contare le occorrenze di ogni parola in un file di testo di grandi dimensioni e analizzare le relazioni tra gli URL delle pagine web. MapReduce consente a ciascun processore di indirizzare parole chiave specifiche in modo indipendente nella fase di mappatura, che comporta la suddivisione del documento in sezioni più piccole. La fase di riduzione prevede il raggruppamento di coppie chiave-valore in base alla parola chiave e la somma dei valori per ottenere il numero totale di presenze per ogni parola. Per l'analisi delle pagine Web, il processo di mappatura prevede la creazione di coppie chiave-valore con l'URL come chiave e un elenco di pagine Web collegate come valori e la fase di riduzione crea la mappa finale per mostrare la relazione tra le pagine Web.

  • 00:00:00 In questa sezione, vediamo un esempio concreto di MapReduce in azione: contare le occorrenze di ogni parola in un file di testo di grandi dimensioni con centinaia di migliaia di parole inglesi. È un caso d'uso ideale per MapReduce perché le diverse parole chiave possono essere conteggiate in modo indipendente, con ogni processore che punta a parole chiave specifiche. La fase di mappatura comporta la suddivisione del documento in parti più piccole, con ogni processore che riceve una sezione di dimensioni simili per contare le occorrenze delle coppie chiave-valore di parole interessanti. La fase di riduzione prevede il raggruppamento di tutte le coppie chiave-valore in base alla parola chiave e la somma dei valori per ottenere il numero totale di presenze per ogni parola. L'esempio dimostra la versatilità di MapReduce dove può essere utilizzato per contare gli accessi alle pagine Web implementando l'URL come parola chiave o analizzando le relazioni dei collegamenti Web di diversi siti Web.

  • 00:05:00 In questa sezione, il relatore spiega come MapReduce può essere utilizzato per analizzare un gran numero di URL di pagine Web e i loro collegamenti per creare un grafico che mostri la relazione tra di loro. Il processo di mappatura prevede il raggruppamento delle tuple in blocchi più piccoli e l'assegnazione ai processori di mappatura per creare una coppia chiave-valore con l'URL come chiave e un elenco di pagine Web come valori che verranno collegati dalla chiave. Quindi, nella fase di riduzione, più chiavi possono essere gestite da diversi processori e la coppia chiave-valore viene utilizzata per costruire la mappa finale e mostrare la relazione tra le pagine web.
Map Reduce Example: WordCount and Weblink
Map Reduce Example: WordCount and Weblink
  • 2020.06.14
  • www.youtube.com
This video introduce MapReduce concept with two examples: word count and web link relationship.
 

23. Considerazioni su MapReduce su dispositivo OpenCL



23. Considerazioni su MapReduce su dispositivo OpenCL

La discussione in questo video di YouTube è incentrata sull'uso di MapReduce sui dispositivi OpenCL, con particolare attenzione alla struttura della memoria, all'organizzazione del lavoro e alla riduzione locale/globale. Il relatore rileva il vantaggio di sfruttare numerosi elementi di elaborazione sui dispositivi OpenCL e sottolinea l'uso di diverse gerarchie di memoria durante l'utilizzo di MapReduce per elaborare in modo efficiente set di dati di grandi dimensioni. Descrivono inoltre in dettaglio i cinque passaggi coinvolti nell'uso di MapReduce sui dispositivi OpenCL, coprendo il processo di mappatura, la riduzione locale, la sincronizzazione degli elementi di lavoro, le barriere globali e la produzione del risultato finale.

  • 00:00:00 In questa sezione, l'attenzione si concentra su come MapReduce sui dispositivi OpenCL differisce dagli ambienti CPU tradizionali. La differenza principale risiede nella struttura della memoria, che è gerarchica e consiste in memoria privata, locale e globale, ciascuna con dimensioni e visibilità dei dati diverse. La memoria privata è visibile solo all'elemento di lavoro stesso, mentre la memoria locale è visibile a tutti gli elementi di lavoro nell'unità di calcolo, ma non tra le unità. La memoria globale, invece, è visibile a tutti gli elementi di lavoro. Sfruttare l'elevato numero di elementi di elaborazione sui dispositivi OpenCL rappresenta un'opportunità, ma la struttura della memoria deve essere presa in considerazione.

  • 00:05:00 In questa sezione, il relatore discute l'uso di MapReduce per eseguire operazioni su dispositivi OpenCL al fine di affrontare problemi come il set di dati OAKLAND. Spiegano la necessità di utilizzare diversi elementi di lavoro e assegnano calcoli a ciascun elemento della matrice su cui lavorare. L'uso della gerarchia della memoria è importante, compresa la memoria primaria e locale, e l'oratore nota il vantaggio dell'uso della memoria locale per alcune delle riduzioni invece della memoria globale. Descrivono in dettaglio come sono organizzati i gruppi di lavoro e come vengono eseguite le operazioni di mappatura per ogni blocco di dati assegnato a un elemento di lavoro. L'uso di MapReduce in questo modo può aiutare a elaborare grandi set di dati in modo efficiente utilizzando dispositivi OpenCL.

  • 00:10:00 In questa sezione, il relatore discute il concetto di riduzione locale e globale in MapReduce su un dispositivo OpenCL. La riduzione locale viene eseguita su coppie chiave-valore prodotte da ciascun elemento di elaborazione, mentre la riduzione globale combina i risultati di più gruppi di lavoro nella memoria globale. La sfida nell'implementazione di MapReduce sui dispositivi OpenCL è che il numero di coppie chiave-valore prodotte dalla fase di mappatura è sconosciuto ed è necessario allocare correttamente gli spazi di memoria per i risultati intermedi. Inoltre, i risultati dell'interazione locale devono essere archiviati nella memoria locale e devono essere considerate diverse gerarchie di memoria.

  • 00:15:00 In questa sezione, il relatore discute i cinque passaggi per MapReduce sui dispositivi OpenCL. La prima fase prevede che il gruppo di elementi di lavoro esegua il processo di mappatura e una parte della fase di riduzione locale. Il secondo passaggio include l'esecuzione di una barriera locale per sincronizzare gli elementi di lavoro prima di eseguire le riduzioni. Il terzo passaggio consiste nel fare in modo che l'elemento di lavoro con ID locale zero in ciascun gruppo elabori preventivamente le coppie chiave-valore prodotte da altri elementi di lavoro. Il quarto passaggio prevede l'esecuzione di una barriera globale per impedire ulteriori esecuzioni fino a quando tutti i lavoratori non avranno terminato. Infine, il quinto passaggio prevede la combinazione dei risultati di ciascun gruppo di lavoro per produrre il risultato finale, assicurandosi che tutti gli elementi di lavoro siano terminati prima di farlo.
Considerations of MapReduce on OpenCL device
Considerations of MapReduce on OpenCL device
  • 2020.06.14
  • www.youtube.com
This video introduces specifics of implementing MapReduce on OpenCL devices.
 

24. MapReduce Esempio: ricerca di stringhe con demo



24. MapReduce Esempio: ricerca di stringhe con demo

Il video mostra vari aspetti della programmazione OpenCL e MapReduce, con particolare attenzione all'implementazione della ricerca di stringhe. L'oratore spiega come dichiarare e allocare la memoria utilizzando il qualificatore locale e sottolinea che l'allocazione dinamica della memoria non è consentita nella funzione del kernel. Introducono anche tipi di dati vettoriali e dimostrano come possono semplificare l'addizione basata sugli elementi e l'accesso alla memoria. L'obiettivo principale è implementare la ricerca di stringhe utilizzando MapReduce, in cui il testo di input è suddiviso in elementi di lavoro e assegnato a una funzione mappa per cercare una parola chiave. Ogni elemento di lavoro esegue questo processo confrontando i blocchi di testo con un vettore di pattern. I risultati locali vengono ottenuti mediante incremento atomico per evitare collisioni e il risultato finale viene ottenuto aggregando i risultati di ciascun elemento di lavoro. L'oratore fornisce anche una spiegazione dettagliata della funzione del kernel, inclusi gli argomenti richiesti e come viene inizializzato.

  • 00:00:00 In questa sezione, il relatore discute l'allocazione della memoria locale in OpenCL e dimostra come può essere eseguita nel contesto di una funzione del kernel di ricerca di stringhe. La memoria locale è dichiarata usando il qualificatore "local" e indicata usando una parentesi quadra interna. L'oratore osserva che l'allocazione dinamica della memoria non è consentita nella funzione del kernel, quindi l'API dell'argomento set kernel viene utilizzata nel programma host per allocare lo spazio di memoria locale. Inoltre, il relatore introduce il tipo di dati vettoriali, che consente operazioni più rapide e semplici su array con più elementi dello stesso tipo.

  • 00:05:00 In questa sezione, il relatore spiega come utilizzare il tipo di dati vettoriali nella funzione del kernel OpenCL per l'addizione basata sugli elementi. L'uso dei vettori semplifica il processo di addizione e assegnazione e l'operazione viene applicata a ogni singolo elemento nel vettore. L'inizializzazione dei vettori può anche essere eseguita esplicitamente con valori specifici o ripetendo un singolo valore per tutti gli elementi nel vettore. L'oratore discute anche di come l'accesso compatto alla memoria tragga vantaggio dal tipo vettoriale, specialmente quando si lavora con un array di caratteri, dove ogni elemento è una lettera o un byte.

  • 00:10:00 In questa sezione, il relatore spiega come utilizzare MapReduce per implementare la ricerca di stringhe con una demo. La ricerca viene eseguita su un testo di input utilizzando uno schema di caratteri di 16 caratteri. Spiegano come viene utilizzata la velocità utilizzando le prime otto lettere del vettore del messaggio e dimostrano anche come accedere agli atomi in un ordine diverso. Elaborano il modo in cui assegnano valori a parti del vettore di caratteri, forniscono esempi e spiegano come costruire la funzione del kernel che cerca il testo di input, inclusi gli argomenti richiesti da quella funzione e come viene inizializzata. Infine, spiegano come si ottengono i risultati globali e cosa significano questi risultati.

  • 00:15:00 In questa sezione, l'oratore spiega il processo di inizializzazione e il punto di sincronizzazione all'interno del recinto di memoria locale per la ricerca di stringhe nell'esempio di MapReduce. I caratteri all'interno del documento originale sono divisi in gruppi, a ciascun gruppo è assegnato un insieme specifico di lettere per cercare la parola chiave corrispondente. L'ID globale e il carattere per elemento vengono utilizzati per identificare il punto di partenza per il lavoro assegnato a ciascun gruppo. Nel complesso, questa sezione fornisce informazioni sugli aspetti tecnici di MapReduce e sulla sua applicazione nella ricerca di stringhe.

  • 00:20:00 In questa sezione, il relatore descrive l'implementazione di MapReduce per eseguire una ricerca di stringhe utilizzando una demo. I dati di input sono divisi in elementi di lavoro e ogni elemento di lavoro viene assegnato a una funzione di mappa per cercare una parola chiave in una porzione di testo. Il relatore mostra come i blocchi di testo vengono caricati nella memoria e la finestra dei caratteri viene spostata per cercare la parola chiave. Per il confronto viene utilizzato un vettore caricato con 16 caratteri e il risultato viene memorizzato in un altro vettore per il blocco. Questo processo viene ripetuto per ciascun elemento di lavoro e il risultato finale si ottiene aggregando i risultati di ciascun elemento di lavoro.

  • 00:25:00 In questa sezione il video spiega come la batteria viene assegnata ad uno specifico capitolo attraverso il confronto dei vettori di testo corrispondenti alle parole chiave inserite dall'utente con il pattern vector. L'operazione di confronto confronta ogni elemento dei due vettori, generando 1 o 0 per ogni elemento. Se c'è una parola chiave, il risultato del confronto determina il valore della batteria assegnata a quello specifico capitolo. Il bit significativo dei primi quattro elementi del vettore di controllo determina se c'è una parola chiave. Se la condizione è vera, il che significa che tutti i bit significativi sono 1, viene trovata una parola chiave e il risultato locale viene incrementato, il che indica che il programma ha trovato una corrispondenza.

  • 00:30:00 In questa sezione, il relatore spiega come funziona un esempio di String Search MapReduce. Il codice è costituito da diversi gruppi di lavoro in cui ogni gruppo verifica la presenza di parole chiave specifiche all'interno del testo che è stato suddiviso in blocchi. L'obiettivo è scoprire se esiste una qualsiasi delle parole chiave in ciascun blocco. Se il risultato è vero, il commento viene incrementato utilizzando l'incremento atomico per evitare collisioni. Dopo che tutte le parole chiave sono state controllate in un blocco, viene impiegata una barriera per garantire che qualsiasi operazione di accesso alla memoria globale sia stata completata. Il ciclo quindi sposta la finestra a destra per controllare la successiva serie di 16 lettere e il processo viene ripetuto per ciascun gruppo di lavoro. Infine, il contatore del risultato locale viene aggiunto al risultato globale utilizzando l'aggiunta atomica per evitare collisioni.

  • 00:35:00 In questa sezione, il relatore spiega l'implementazione di un esempio MapReduce per la ricerca di stringhe con demo. Viene spiegata la funzione del kernel, in cui la memoria locale viene inizializzata, i contatori vengono azzerati e il programma utilizza Pope ID per calcolare l'offset e caricare 16 byte alla volta nel vettore di testo. La funzione quindi confronta i risultati ed esegue la riduzione globale utilizzando prima di tutto e la funzione di riduzione. Viene mostrato il codice di esempio su GitHub e il relatore delinea gli argomenti, ad esempio modelli, fattore di testo, buffer di testo, carattere per un elemento, lunghezza totale del testo originale e dimensione dell'immagine. Infine, parla di come la dimensione globale dipenda dalle risorse disponibili e dalla scienza formale coinvolta nel processo di ricerca della stringa desiderata.

  • 00:40:00 In questa sezione, il docente spiega l'esempio dell'utilizzo di MapReduce per cercare parole specifiche in un determinato file di testo. L'obiettivo è contare l'occorrenza di quattro determinate parole nel file di testo. Il docente suggerisce di rivedere il codice sorgente e il runtime per una migliore comprensione del processo.
MapReduce Example: String Search with Demo
MapReduce Example: String Search with Demo
  • 2020.06.14
  • www.youtube.com
This video explains the implementation of string search on OpenCL device using MapReduce approach. Vector instructions and operations are briefly explained. ...
 

25. Esempio OpenCL: Radix Sort



25. Esempio OpenCL: Radix Sort

In questo video viene introdotto il concetto di radix sort, che comporta la divisione di un problema di ordinamento più ampio in sottoinsiemi più piccoli basati sulla rappresentazione numerica anziché sui valori effettivi degli elementi ordinati. L'oratore dimostra attraverso un esempio di ordinamento di otto numeri, ordinati in base alla cifra meno significativa nella rappresentazione esadecimale. Le funzioni OpenCL shuffle e shuffle2 vengono utilizzate per riorganizzare in modo efficiente gli elementi durante il processo di ordinamento. Il video spiega anche come eseguire un'operazione di riproduzione casuale utilizzando OpenCL e come utilizzare le istruzioni di riproduzione casuale nella funzione del kernel per l'ordinamento digitale. Inoltre, il video esplora la funzione del kernel chiamata radix sort eight sort eight, che ordina in modo efficace gli array in OpenCL suddividendo il vettore di input in bucket di zeri e uno in base ai valori nelle sue cifre binarie.

  • 00:00:00 In questa sezione, il video introduce il concetto di radix sort, che divide un grande problema di ordinamento in problemi più piccoli, ordinati per sottoinsiemi. Il processo di ordinamento viene eseguito in base alla rappresentazione numerica degli elementi, piuttosto che ai valori degli elementi stessi. L'oratore dimostra attraverso un esempio di ordinamento di 8 numeri, in cui l'ordinamento si basa sulla cifra meno significativa nella rappresentazione esadecimale. Il processo di ordinamento viene eseguito attraverso diverse iterazioni, in cui i numeri vengono inseriti in secchi in base alle cifre più insignificanti e ripetuti per ulteriori cifre finché i numeri non vengono ordinati in ordine crescente.

  • 00:05:00 In questa sezione del video, il relatore mostra come applicare l'ordinamento digitale a una serie di numeri organizzandoli prima in gruppi in base alla loro cifra più significativa. Quindi ripetono il processo utilizzando la cifra meno significativa e continuano fino a quando non hanno esaminato tutte le cifre di ciascun numero. L'oratore osserva che ogni passaggio di radix sort è essenzialmente uno shuffle e l'utilizzo delle funzioni shuffle di OpenCL consente il riarrangiamento efficiente degli elementi durante il processo di ordinamento. Infine, il relatore fornisce un esempio di come utilizzare una maschera per specificare gli indici degli elementi che devono essere ordinati e mostra come applicare questo concetto con due vettori e un array maschera.

  • 00:10:00 In questa sezione viene spiegato l'uso della funzione shuffle e della funzione shuffle2 in OpenCL. La funzione shuffle crea un vettore di output che sposta o mescola i valori originali dai vettori di input in base alla maschera data per creare un nuovo vettore di output. La funzione shuffle2 è simile ma accetta due vettori di input invece di uno. La dimensione e il tipo di dati della maschera devono corrispondere al fattore restituito e il tipo di dati deve essere un tipo intero senza segno. Inoltre, il fattore restituito avrà lo stesso tipo di dati e lo stesso numero di componenti del vettore di input e solo un numero selezionato di bit nei componenti del vettore della maschera è significativo. Il valore di K in shuffle2 dipende dal numero di componenti nel vettore di input.

  • 00:15:00 In questa sezione, il relatore spiega come eseguire un'operazione di riproduzione casuale utilizzando OpenCL. Forniscono un esempio di un'operazione di riproduzione casuale che accetta un vettore di input e una maschera e restituisce un vettore basato sui valori selezionati dal vettore di input dalla maschera. Spiegano inoltre come utilizzare i valori della maschera per determinare quali valori selezionare dal vettore di input per creare il vettore di output. Il relatore fornisce un secondo esempio che coinvolge due vettori di input contenenti lettere e spiega come utilizzare la maschera per costruire il vettore di output in base ai valori selezionati dai vettori di input.

  • 00:20:00 In questa sezione, il video illustra l'uso delle istruzioni shuffle nella funzione kernel dell'esempio OpenCL per l'ordinamento digitale. La funzione del kernel si chiama "shuffle test" e accetta due argomenti: un vettore a virgola mobile e un vettore di caratteri a 16 elementi. Il video mostra un esempio di utilizzo di un vettore intero come maschera per creare un vettore di output contenente otto numeri in virgola mobile utilizzando un vettore in virgola mobile di quattro elementi come input. Il video prosegue spiegando come funziona l'ordinamento nella funzione del kernel osservando la cifra binaria meno significativa e utilizzandola per individuare i numeri dispari per creare un nuovo vettore.

  • 00:25:00 In questa sezione del video, il relatore spiega come costruire una maschera basata sulla cifra meno significativa degli elementi in un vettore per ordinarli utilizzando l'algoritmo di ordinamento digitale. Copiando gli elementi in vettori designati e costruendo una maschera basata sulla cifra meno significativa degli elementi, è possibile utilizzare shuffle to function per recuperare i valori dai vettori originali e designati e costruire un nuovo vettore. Questo processo ordina i numeri di base in due segmenti, 0 e 1, in base alle loro cifre binarie.

  • 00:30:00 In questa sezione impareremo a conoscere la funzione del kernel chiamata radix sort eight sort eight, che funziona suddividendo il vettore di input in intervalli di zeri e unità in base ai valori nelle sue cifre binarie. La funzione kernel definisce una struttura di unione utilizzata come buffer per ordinare l'array di dati utilizzando due contatori, conteggio zero e conteggio uno. Il valore CMP uno viene utilizzato per determinare quale cifra binaria confrontare i valori e la funzione utilizza due array, mask one e dati, corrispondenti al diagramma nel video, per memorizzare gli elementi ordinati. Il ciclo for ha otto iterazioni per lavorare sugli otto numeri da ordinare, e J va da zero a otto per determinare quanti elementi dovrebbero andare nei bucket zero e uno. Radix sort eight sort eight è un modo efficace per ordinare gli array in OpenCL.

  • 00:35:00 In questa sezione, l'oratore spiega come funziona l'ordinamento digitale, che comporta l'ordinamento dei valori in un set di dati in base alla cifra corrispondente in ogni posizione. Il processo inizia con la cifra meno significativa e si sposta verso la cifra più significativa. L'oratore utilizza un esempio per mostrare come i valori che terminano con uno e zero vengono separati in diversi array prima di eseguire un'operazione di shuffle per creare il vettore di output finale. Il processo viene ripetuto per le altre cifre e il risultato finale viene memorizzato in un buffer globale.
OpenCL Example: Radix Sort
OpenCL Example: Radix Sort
  • 2020.03.26
  • www.youtube.com
OpenCL Example: Radix Sort using Shuffle Function
Motivazione: