| Nome: | Descrição: | Tamanho: | Formato: | |
|---|---|---|---|---|
| 694.24 KB | Adobe PDF |
Orientador(es)
Resumo(s)
Nowadays computational systems are heterogeneous typically containing CPUs and
GPUs. Offloading computations to a GPU allows more computations per time unit, spe-
cially when GPUs are more efficient than CPUs for some type of computations, like
matrix multiplication. There is, nonetheless, a specific complexity associated with writing
portable code, specially when dealing with the integration of the programming of GPUs
in mainstream programming languages, avoiding low-level complex frameworks like
CUDA and OpenCL.
The proposals put forth to solve these questions can be divided into two fields: spe-
cialized skeleton frameworks with reduced expressiveness, and languages (or language
extensions) that follow a best-effort strategy. Nonetheless, efficient usage of these lan-
guages requires the programmer reasons about code compatibility while considering the
GPUs execution model and the limitations of the compilers themselves.
The herein documented approach takes a different route, offering a programming
model in which the programmer expresses the GPU computations by manipulating data
structures in a way that is equivalent to the computations designed for CPU. This expres-
siveness is achieved without prejudice to the guarantee that the expressed computations
will run in GPU context.
The methodology chosen to implement this approach rests on an expression template
layer. This expression template layer generates both the Marrow framework code, to
launch the OpenCL kernels, and the OpenCL kernels to be run. The generated code is
reused in subsequent executions being that the generation only happens at the first time a
computation is to be computed. From the tests developed there was a significant reduction
of lines of code. The technique’s overhead has a reduced impact in the computation time,
as shown by our results, being that the most noticeable feature is that the overhead is not
proportional to the expressions complexity; our results point to an overhead of 9 to 10% in
worst case scenario, and approaching 0% as the OpenCL computational time increases.
Actualmente os sistemas computacionais são heterogéneos, tipicamente contendo CPUs e GPUs. Executar o offload de computações para o GPU permite executar mais computações por unidade de tempo, especialmente quando se sabe que os GPUs são mais eficientes que os CPUs para alguns tipos de computação tais como a multiplicação de matrizes. Para evitar a complexidade associada a frameworks de baixo nível, tal como CUDA e OpenCL, procura-se a integração da programação de GPUs em linguagens mainstream. Contudo a escrita de código portável, abstraindo dos detalhes da programação de GPU tem uma complexidade própria. As propostas feitas para solucionar estas questões podem ser divididas em dois cam- pos: bibliotecas de skeletons muito especializadas e, por desenho, de expressividade muito limitada e linguagens ou extensões de linguagens que adoptam uma filosofia de melhor esforço. No entanto, a utilização eficiente destas linguagens requer que o programador raciocine sobre a compatibilidade do seu código com o modelo de execução dos GPUS e sobre a limitações do próprios compiladores. A abordagem aqui documentada é diferente: oferece um modelo de programação em que o programador exprime as computações GPU manipulando estruturas de dados de forma equivalente às computações para CPU. Esta expressividade é atingida sem prejudicar a garantia que as computações são executadas em contexto GPU. Para a solução conseguir fazer o pretendido, utiliza-se a framework Marrow para executar os kerneis OpenCL. A metodologia para implementar a abordagem assenta numa camada de expression templates. A camada de expression templates gera o código de biblioteca e o código de backend, que no nosso caso mapeiam para código Marrow e código OpenCL. O código gerado é reutilizado de execuções anteriores, sendo que a geração ocorre na primeira execução da computação. Dos testes efectuados detectou-se uma redução das linhas de código, reduzindo o código em OpenCL e Marrow em 100%. O overhead da técnica escolhida tem um impacto reduzido, tal como comprovam os testes efectuados, sendo que o overhead é não-proporcional à complexidade da expressão avaliada; os resultados apontam para que o overhead tenha um peso entre 9% a 10% no pior caso, e tendendo para 0% à medida que a computação OpenCL consome mais tempo.
Actualmente os sistemas computacionais são heterogéneos, tipicamente contendo CPUs e GPUs. Executar o offload de computações para o GPU permite executar mais computações por unidade de tempo, especialmente quando se sabe que os GPUs são mais eficientes que os CPUs para alguns tipos de computação tais como a multiplicação de matrizes. Para evitar a complexidade associada a frameworks de baixo nível, tal como CUDA e OpenCL, procura-se a integração da programação de GPUs em linguagens mainstream. Contudo a escrita de código portável, abstraindo dos detalhes da programação de GPU tem uma complexidade própria. As propostas feitas para solucionar estas questões podem ser divididas em dois cam- pos: bibliotecas de skeletons muito especializadas e, por desenho, de expressividade muito limitada e linguagens ou extensões de linguagens que adoptam uma filosofia de melhor esforço. No entanto, a utilização eficiente destas linguagens requer que o programador raciocine sobre a compatibilidade do seu código com o modelo de execução dos GPUS e sobre a limitações do próprios compiladores. A abordagem aqui documentada é diferente: oferece um modelo de programação em que o programador exprime as computações GPU manipulando estruturas de dados de forma equivalente às computações para CPU. Esta expressividade é atingida sem prejudicar a garantia que as computações são executadas em contexto GPU. Para a solução conseguir fazer o pretendido, utiliza-se a framework Marrow para executar os kerneis OpenCL. A metodologia para implementar a abordagem assenta numa camada de expression templates. A camada de expression templates gera o código de biblioteca e o código de backend, que no nosso caso mapeiam para código Marrow e código OpenCL. O código gerado é reutilizado de execuções anteriores, sendo que a geração ocorre na primeira execução da computação. Dos testes efectuados detectou-se uma redução das linhas de código, reduzindo o código em OpenCL e Marrow em 100%. O overhead da técnica escolhida tem um impacto reduzido, tal como comprovam os testes efectuados, sendo que o overhead é não-proporcional à complexidade da expressão avaliada; os resultados apontam para que o overhead tenha um peso entre 9% a 10% no pior caso, e tendendo para 0% à medida que a computação OpenCL consome mais tempo.
Descrição
Palavras-chave
Expression templates Algorithmic skeletons Heterogeneous Computation Marrow
