Kernels de ordem superior para GPUs compatíveis com OpenCL utilizando metaprogramação em Elixir
Resumo
A programação de GPUs exige o uso de APIs de baixo nível, como CUDA e OpenCL, que dificultam a criação de abstrações como funções de ordem superior. Linguagens de Domínio Específico (DSLs) atenuam esse problema, mas apresentam limitações de portabilidade ou expressividade. Este artigo apresenta a OCL-PolyHok, uma DSL embutida em Elixir que permite a execução de kernels de ordem superior em OpenCL, contornando a ausência de suporte a ponteiros de função por meio de geração de código e especialização em tempo de execução. Experimentos com seis benchmarks indicam, com 95% de confiança estatística, desempenho superior à versão baseada em CUDA, com menor overhead de compilação JIT, mantendo portabilidade e expressividade.Referências
Abadi, M., Barham, P., Chen, J., Chen, Z., Davis, A., Dean, J., Devin, M., Ghemawat, S., Irving, G., Isard, M., et al. (2016). TensorFlow: a system for large-scale machine learning. In Proc. USENIX OSDI 2016, pages 265–283.
Catanzaro, B., Garland, M., and Keutzer, K. (2011). Copperhead: compiling an embedded data parallel language. SIGPLAN Not., 46(8):47–56.
Chakravarty, M. M., Keller, G., Lee, S., McDonell, T. L., and Grover, V. (2011). Accelerating Haskell array codes with multicore GPUs. In Proc. 6th DAMP Workshop, page 3–14, New York, USA. ACM.
Clarkson, J., Fumero, J., Papadimitriou, M., Zakkak, F. S., Xekalaki, M., Kotselidis, C., and Luján, M. (2018). Exploiting High-performance Heterogeneous Hardware for Java Programs Using Graal. In Proc. ManLang 2018, pages 4:1–4:13.
Du Bois, A., Perlin, T., Antunes, F., and Cavalheiro, G. (2024). Hok: Higher-Order GPU kernels in Elixir. In Anais SBLP 2024, pages 71–80, Porto Alegre, RS, Brasil. SBC.
Du Bois, A. R. and Cavalheiro, G. (2023). GPotion: An embedded DSL for GPU programming in Elixir. In Proc. SBLP 2023, page 1–8, New York, USA. ACM.
Du Bois, A. R. and Cavalheiro, G. (2025). Polymorphic Higher-Order GPU Kernels. In Proc. Euro-Par 2025. Springer Nature.
Elixir Team (2026). Elixir Lang. Doc. The Elixir Team. Disponível em: [link].
Ernstsson, A., Ahlqvist, J., Zouzoula, S., and Kessler, C. (2021). SkePU 3: Portable High-Level Programming of Heterogeneous Systems and HPC Clusters. Int. J. Parallel Program., 49(6):846–866.
Henriksen, T., Serup, N. G. W., Elsman, M., Henglein, F., and Oancea, C. E. (2017). Futhark: purely functional GPU-programming with nested parallelism and in-place array updates. In Proc. ACM SIGPLAN PLDI 2017, pages 556–571, New York, USA. ACM.
Ishizaki, K., Hayashi, A., Koblents, G., and Sarkar, V. (2015). Compiling and Optimizing Java 8 Programs for GPU Execution. In Proc. IEEE PACT 2015, pages 419–431.
Khronos OpenCL Working Group (2016). OpenCL C Spec. v2.0. The Khronos Group Inc. Disponível em: [link].
Kolesnichenko, A., Poskitt, C. M., Nanz, S., and Meyer, B. (2015). Contract-based general-purpose GPU programming. In Proc. ACM SIGPLAN GPCE 2015, page 75–84. ACM.
Lam, S. K., Pitrou, A., and Seibert, S. (2015). Numba: a LLVM-based Python JIT compiler. In Proc. LLVM-HPC 2015, page 7.
Metzger, P. (2021). Programmer-transparent efficient parallelism with skeletons. PhD thesis, Univ. Edinburgh.
Munshi, A., Gaster, B., Mattson, T. G., Fung, J., and Ginsburg, D. (2011). OpenCL Programming Guide. Addison-Wesley Educational, Boston, MA.
Okuta, R., Unno, Y., Nishino, D., Hido, S., and Loomis, C. (2017). CuPy: A NumPy-Compatible Library for NVIDIA GPU Calculations. In Proc. LearningSys (NIPS) 2017.
Rubinsteyn, A., Hielscher, E., Weinman, N., and Shasha, D. (2012). Parakeet: a just-in-time parallel accelerator for python. In Proc. USENIX HotPar 2012, page 14.
Steuwer, M., Kegel, P., and Gorlatch, S. (2011). SkelCL - A Portable Skeleton Library for High-Level GPU Programming. In Proc. IEEE IPDPSW 2011, pages 1176–1182.
Yan, Y., Grossman, M., and Sarkar, V. (2009). JCUDA: A Programmer-Friendly Interface for Accelerating Java Programs with CUDA. In Proc. Euro-Par 2009, pages 887–899.
Catanzaro, B., Garland, M., and Keutzer, K. (2011). Copperhead: compiling an embedded data parallel language. SIGPLAN Not., 46(8):47–56.
Chakravarty, M. M., Keller, G., Lee, S., McDonell, T. L., and Grover, V. (2011). Accelerating Haskell array codes with multicore GPUs. In Proc. 6th DAMP Workshop, page 3–14, New York, USA. ACM.
Clarkson, J., Fumero, J., Papadimitriou, M., Zakkak, F. S., Xekalaki, M., Kotselidis, C., and Luján, M. (2018). Exploiting High-performance Heterogeneous Hardware for Java Programs Using Graal. In Proc. ManLang 2018, pages 4:1–4:13.
Du Bois, A., Perlin, T., Antunes, F., and Cavalheiro, G. (2024). Hok: Higher-Order GPU kernels in Elixir. In Anais SBLP 2024, pages 71–80, Porto Alegre, RS, Brasil. SBC.
Du Bois, A. R. and Cavalheiro, G. (2023). GPotion: An embedded DSL for GPU programming in Elixir. In Proc. SBLP 2023, page 1–8, New York, USA. ACM.
Du Bois, A. R. and Cavalheiro, G. (2025). Polymorphic Higher-Order GPU Kernels. In Proc. Euro-Par 2025. Springer Nature.
Elixir Team (2026). Elixir Lang. Doc. The Elixir Team. Disponível em: [link].
Ernstsson, A., Ahlqvist, J., Zouzoula, S., and Kessler, C. (2021). SkePU 3: Portable High-Level Programming of Heterogeneous Systems and HPC Clusters. Int. J. Parallel Program., 49(6):846–866.
Henriksen, T., Serup, N. G. W., Elsman, M., Henglein, F., and Oancea, C. E. (2017). Futhark: purely functional GPU-programming with nested parallelism and in-place array updates. In Proc. ACM SIGPLAN PLDI 2017, pages 556–571, New York, USA. ACM.
Ishizaki, K., Hayashi, A., Koblents, G., and Sarkar, V. (2015). Compiling and Optimizing Java 8 Programs for GPU Execution. In Proc. IEEE PACT 2015, pages 419–431.
Khronos OpenCL Working Group (2016). OpenCL C Spec. v2.0. The Khronos Group Inc. Disponível em: [link].
Kolesnichenko, A., Poskitt, C. M., Nanz, S., and Meyer, B. (2015). Contract-based general-purpose GPU programming. In Proc. ACM SIGPLAN GPCE 2015, page 75–84. ACM.
Lam, S. K., Pitrou, A., and Seibert, S. (2015). Numba: a LLVM-based Python JIT compiler. In Proc. LLVM-HPC 2015, page 7.
Metzger, P. (2021). Programmer-transparent efficient parallelism with skeletons. PhD thesis, Univ. Edinburgh.
Munshi, A., Gaster, B., Mattson, T. G., Fung, J., and Ginsburg, D. (2011). OpenCL Programming Guide. Addison-Wesley Educational, Boston, MA.
Okuta, R., Unno, Y., Nishino, D., Hido, S., and Loomis, C. (2017). CuPy: A NumPy-Compatible Library for NVIDIA GPU Calculations. In Proc. LearningSys (NIPS) 2017.
Rubinsteyn, A., Hielscher, E., Weinman, N., and Shasha, D. (2012). Parakeet: a just-in-time parallel accelerator for python. In Proc. USENIX HotPar 2012, page 14.
Steuwer, M., Kegel, P., and Gorlatch, S. (2011). SkelCL - A Portable Skeleton Library for High-Level GPU Programming. In Proc. IEEE IPDPSW 2011, pages 1176–1182.
Yan, Y., Grossman, M., and Sarkar, V. (2009). JCUDA: A Programmer-Friendly Interface for Accelerating Java Programs with CUDA. In Proc. Euro-Par 2009, pages 887–899.
Publicado
19/07/2026
Como Citar
RODRIGUES, Henrique Gabriel; DU BOIS, André Rauber; CAVALHEIRO, Gerson Geraldo H..
Kernels de ordem superior para GPUs compatíveis com OpenCL utilizando metaprogramação em Elixir. In: SEMINÁRIO INTEGRADO DE SOFTWARE E HARDWARE (SEMISH), 53. , 2026, Gramado/RS.
Anais [...].
Porto Alegre: Sociedade Brasileira de Computação,
2026
.
p. 422-433.
ISSN 2595-6205.
DOI: https://doi.org/10.5753/semish.2026.23782.
