In the last decade parallel computing systems have acquired large importance not only in high performance computers but also in consumer PCs. Parallel computing has been applied both in central processing units and in dedicated graphics cards. GPUs have been involved in major changes in recent years. Originally conceived to perform graphics computations only, they are presently used to perform tasks intrinsically hard for standard CPUs. Consequently new programming patterns able to exploit the potential offered by parallel devices are now required. This is the goal of OpenCL. OpenCL is an open programming framework developed by a consortium of IT companies. It allows to write computational intensive software both for GPU and CPU. The value of OpenCL lies in its portability. In addition, it is supported by many vendors: Intel, NVIDIA, AMD/ATI and others. OpenCL introduces a new specific programming language to write the functions that will be executed by the computing devices, named OpenCL C. This is an extension of C99 with specific enhancements for memory management and parallel operations. At the moment no open source compiler supports OpenCL, creating machine code starting from OpenCL C source code. Until now all the companies of the OpenCL consortium have built closed-source compilers. The primary goal of this thesis is therefore to extend the front-end of the LLVM compiler in order to support the OpenCL C extensions and generate suitable intermediate code. In order to test the compiler in a proper way it has been embedded into a completely redesigned version of the OpenCL runtime. This is the set of data structures needed to manage the execution of programs by the computing devices, called kernels. The duties of the runtime are the management of the device memory, data transfer from the host to the device and vice versa, scheduling of kernel execution managing the dependencies. The extended version of LLVM allows the compilation and the execution of full OpenCL C programs exploiting the potential of the OpenCL runtime.

Negli ultimi dieci anni i sistemi di computazione parallela hanno assunto un ruolo determinante non solo nei computer ad alte prestazioni ma anche nei PC per il grande pubblico. Questo paradigma ha trovato applicazione sia nei processori centrali che nelle schede grafiche dedicate al rendering video. Queste ultime sono state protagoniste di un grande cambiamento che, da strumenti dedicati a un solo compito, le ha portate a essere sfruttate per risolvere problemi intrinsecamente complessi per le classiche CPU. Si è quindi determinata l’esigenza di creare modelli di programmazione capaci di sfruttare in modo completo le potenzialità offerte dal calcolo parallelo. OpenCL si pone proprio questo obiettivo. OpenCL è uno standard di programmazione sviluppato da un consorzio di aziende di Information Technology che permette di scrivere programmi paralleli sia per CPU che per GPU. L’importanza di questo standard sta proprio nella caratteristica di essere cross-platform e di essere supportato da differenti produttori di hardware come Intel, NVIDIA, AMD/ATI, e altri. OpenCL definisce un suo specifico linguaggio di programmazione che permette di scrivere i programmi che verranno eseguiti dai dispositivi disponibili. Questo linguaggio è un’estensione del C99 con specifiche aggiunte di basso livello per la gestione della memoria e di operazioni parallele. Attualmente non esistono implementazioni open-source di un compilatore in grado di produrre codice macchina partendo da codice OpenCL C. Le aziende del consorzio OpenCL hanno realizzato compilatori closed-source. L’obiettivo primario di questa tesi è quindi quello di aggiungere al front-end del compilatore LLVM la possibilità di riconoscere le principali estensioni di OpenCL C e di generare codice intermedio in modo opportuno. Per essere testato in modo completo il compilatore è stato inserito all’interno di una nuova implementazione del runtime OpenCL. Il runtime è l’insieme di strutture dati e funzioni che permettono l’esecuzione dei programmi OpenCL, chiamati kernel. I suoi compiti consistono nella gestione della memoria delle unità di calcolo, trasferimento di dati da e verso il device, invio in esecuzione dei kernel gestendone le dipendenze. La versione estesa di LLVM permette la compilazione di programmi OpenCL completi che sfruttano le potenzialità offerte dal runtime.

Design and Implementation of a LLVM based OpenCL compiler

MAGNI, ALBERTO
2009/2010

Abstract

In the last decade parallel computing systems have acquired large importance not only in high performance computers but also in consumer PCs. Parallel computing has been applied both in central processing units and in dedicated graphics cards. GPUs have been involved in major changes in recent years. Originally conceived to perform graphics computations only, they are presently used to perform tasks intrinsically hard for standard CPUs. Consequently new programming patterns able to exploit the potential offered by parallel devices are now required. This is the goal of OpenCL. OpenCL is an open programming framework developed by a consortium of IT companies. It allows to write computational intensive software both for GPU and CPU. The value of OpenCL lies in its portability. In addition, it is supported by many vendors: Intel, NVIDIA, AMD/ATI and others. OpenCL introduces a new specific programming language to write the functions that will be executed by the computing devices, named OpenCL C. This is an extension of C99 with specific enhancements for memory management and parallel operations. At the moment no open source compiler supports OpenCL, creating machine code starting from OpenCL C source code. Until now all the companies of the OpenCL consortium have built closed-source compilers. The primary goal of this thesis is therefore to extend the front-end of the LLVM compiler in order to support the OpenCL C extensions and generate suitable intermediate code. In order to test the compiler in a proper way it has been embedded into a completely redesigned version of the OpenCL runtime. This is the set of data structures needed to manage the execution of programs by the computing devices, called kernels. The duties of the runtime are the management of the device memory, data transfer from the host to the device and vice versa, scheduling of kernel execution managing the dependencies. The extended version of LLVM allows the compilation and the execution of full OpenCL C programs exploiting the potential of the OpenCL runtime.
SPEZIALE, ETTORE
ING V - Facolta' di Ingegneria dell'Informazione
31-mar-2011
2009/2010
Negli ultimi dieci anni i sistemi di computazione parallela hanno assunto un ruolo determinante non solo nei computer ad alte prestazioni ma anche nei PC per il grande pubblico. Questo paradigma ha trovato applicazione sia nei processori centrali che nelle schede grafiche dedicate al rendering video. Queste ultime sono state protagoniste di un grande cambiamento che, da strumenti dedicati a un solo compito, le ha portate a essere sfruttate per risolvere problemi intrinsecamente complessi per le classiche CPU. Si è quindi determinata l’esigenza di creare modelli di programmazione capaci di sfruttare in modo completo le potenzialità offerte dal calcolo parallelo. OpenCL si pone proprio questo obiettivo. OpenCL è uno standard di programmazione sviluppato da un consorzio di aziende di Information Technology che permette di scrivere programmi paralleli sia per CPU che per GPU. L’importanza di questo standard sta proprio nella caratteristica di essere cross-platform e di essere supportato da differenti produttori di hardware come Intel, NVIDIA, AMD/ATI, e altri. OpenCL definisce un suo specifico linguaggio di programmazione che permette di scrivere i programmi che verranno eseguiti dai dispositivi disponibili. Questo linguaggio è un’estensione del C99 con specifiche aggiunte di basso livello per la gestione della memoria e di operazioni parallele. Attualmente non esistono implementazioni open-source di un compilatore in grado di produrre codice macchina partendo da codice OpenCL C. Le aziende del consorzio OpenCL hanno realizzato compilatori closed-source. L’obiettivo primario di questa tesi è quindi quello di aggiungere al front-end del compilatore LLVM la possibilità di riconoscere le principali estensioni di OpenCL C e di generare codice intermedio in modo opportuno. Per essere testato in modo completo il compilatore è stato inserito all’interno di una nuova implementazione del runtime OpenCL. Il runtime è l’insieme di strutture dati e funzioni che permettono l’esecuzione dei programmi OpenCL, chiamati kernel. I suoi compiti consistono nella gestione della memoria delle unità di calcolo, trasferimento di dati da e verso il device, invio in esecuzione dei kernel gestendone le dipendenze. La versione estesa di LLVM permette la compilazione di programmi OpenCL completi che sfruttano le potenzialità offerte dal runtime.
Tesi di laurea Magistrale
File allegati
File Dimensione Formato  
2011_3_Magni.pdf

accessibile in internet solo dagli utenti autorizzati

Descrizione: Thesis text
Dimensione 1.06 MB
Formato Adobe PDF
1.06 MB Adobe PDF   Visualizza/Apri

I documenti in POLITesi sono protetti da copyright e tutti i diritti sono riservati, salvo diversa indicazione.

Utilizza questo identificativo per citare o creare un link a questo documento: https://hdl.handle.net/10589/17424