最近搜一些GPU相关的概念时,总会搜到上面这个网页,似乎这个网站的权重挺高的,这篇文章对于如何用Julia做GPU编程进行了简单的介绍。
关于GPU编程的一点感受是,总是不可避免要写一些自定义的kernel,GPUArrays.jl 虽然提供了一些封装,但写起来仍然很麻烦,尤其是想写一些General的kernel的时候。这方面的教程挺少的,不知道大家有没有什么经验可以分享?
最近搜一些GPU相关的概念时,总会搜到上面这个网页,似乎这个网站的权重挺高的,这篇文章对于如何用Julia做GPU编程进行了简单的介绍。
关于GPU编程的一点感受是,总是不可避免要写一些自定义的kernel,GPUArrays.jl 虽然提供了一些封装,但写起来仍然很麻烦,尤其是想写一些General的kernel的时候。这方面的教程挺少的,不知道大家有没有什么经验可以分享?
GPUArrays
比较类似 CUDA 的 Thrust 那类库,提供常用的 Map/Reduce 操作(当然也封装了CUDA生态圈的其它库cuBLAS/FFT)。对于不能简单转化为 Map/Reduce 操作的实际问题(尤其是domain specific的时候),通常需要自定义 kernel 来追求更好的性能。我感觉 GPUArrays
的定位是针对不想手动写 kernel 的用户提供一种 “It just works” 的用户体验,想充分利用 GPU 算力的话还是免不了手写 kernel 优化。
CUDAnative/drv 归根结底是一个 CUDA wrapper + Julia2PTX transpiler, 与 CUDA C/C++工具链相比,在手写 kernel 方面并没有提供什么额外的帮助。同样的 kernel 用 nvcc 编出来与用 CUDAnative 编出来的性能基本大同小异(可以参考两年前Tim在Nvidia devblog上的那篇博客)。倒是一些 CUDA 的新 feature 并不能完全及时地 map 到 Julia,比如 __restrict__
qualifier,cooperative group。没办法,Julia 某个 domain 的生态圈的开发者只有个位数也是常态了。相比之下 CUDA C/C++ 的生态圈非常成熟,资料也很多,手写 kernel 的负担比较小,留出 C API 做 Interop 也不麻烦。唯一的“不足”之处恐怕也就是这条线吧。。。