最近,我研究了GPU计算的用法,其中软件包的用法似乎令人困惑。
例如,CuArrays和ArrayFire似乎在做同样的事情,在这里ArrayFire似乎是在NVIDIA开发者网页上的“官”包。(https://devblogs.nvidia.com/gpu-computing-julia-programming-language)
此外,还有CUDAdrv和CUDAnative软件包...,它们似乎令人困惑,因为它们的功能似乎不像其他软件包那么简单。
这些软件包有什么作用?CuArrays和ArrayFire有什么区别吗?
正如您分享的博客文章中所述,它非常简单,如下所示
Julia软件包生态系统已经包含了许多与GPU相关的软件包,针对不同的抽象级别,如图1所示。在最高抽象级别,特定于域的软件包(例如MXNet.jl和TensorFlow.jl)可以透明地使用系统中的GPU。ArrayFire.jl可以进行更通用的开发,如果您需要线性代数或深度神经网络算法的专用CUDA实现,则可以使用供应商特定的程序包,例如cuBLAS.jl或cuDNN.jl。所有这些软件包实际上都是本机库的包装,它们利用Julia的外部函数接口(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的负担以及维护/调整内核以获得最佳性能的负担,我认为这会花费很多时间。
PS。我是ArrayFire开发团队的成员。