我最近研究了GPU计算的使用,其中包的使用似乎令人困惑。
例如,CuArrays和ArrayFire似乎也在做同样的事情,其中ArrayFire似乎是Nvidia开发人员网页上的"官方"软件包。(https://devblogs.nvidia.com/gpu-computing-julia-programming-language )
此外,还有CUDAdrv和CUDAnative Packages...,这似乎令人困惑,因为它们的功能似乎不像其他功能那么简单。
这些软件包有什么作用?CuArrays和ArrayFire之间有什么区别吗?
正如您分享的博客文章中所解释的,它非常简单,如下所示
Julia 软件包生态系统已经包含相当多的 GPU 相关 包,面向不同的抽象级别,如图 1 所示。 在最高的抽象级别,特定于域的包,如 MXNet.jl 和 TensorFlow.jl 可以透明地使用 GPU 系统。使用ArrayFire.jl可以进行更通用的开发,如果 您需要线性代数或深度的专用 CUDA 实现 神经网络算法,您可以使用特定于供应商的软件包,例如 cuBLAS.jl 或 cuDNN.jl.所有这些包本质上都是包装器 围绕原生图书馆,利用茱莉亚的外来功能 接口 (FFI),用于以最小的开销调用库的 API。
CUDAdrv 和 CUDAnative 包旨在直接使用 CUDA 运行时 API 并从 Julia 本身编写内核。我相信这就是CuArray派上用场的地方 - 粗略地说,将本机Julia对象包装为CUDA可访问格式。
另一方面,ArrayFire是一个通用库,它包裹了所有(cuBLAS,cuSparse,cuSolve,cuFFT)CUDA将特定于领域的库提供给漂亮的接口(函数)。除了与CUDA特定领域库的接口外,ArrayFire本身还提供了统计,图像处理,计算机视觉等领域的许多其他功能。它具有很好的JIT功能,可以将用户的代码编译为运行时内核 - 简单地说。ArrayFire.jl是一种语言绑定,在包装器级别有一些额外的Julia特定改进。
这是普遍的区别。从开发人员的角度来看,使用库(如 ArrayFire)基本上消除了跟上 CUDA API 和维护/调整内核以获得最佳性能的负担,我认为这需要花费大量时间。
附言。我是ArrayFire开发团队的成员。