Julia、CuArrays 和 ArrayFire 中对 Nvidia GPU 包的混淆
Confusion over Nvidia GPU packages in Julia, CuArrays and ArrayFire
我最近研究了GPU计算的使用,其中package的使用似乎很混乱。
例如,CuArrays 和 ArrayFire 似乎在做同样的事情,其中 ArrayFire 似乎是 Nvidia 开发人员网页上的 "official" 包。(https://devblogs.nvidia.com/gpu-computing-julia-programming-language )
此外,还有 CUDAdrv 和 CUDAnative 包...,这似乎令人困惑,因为它们的功能似乎不像其他包那么简单。
这些包有什么作用? CuArrays 和 ArrayFire 有区别吗?
正如您分享的博客 post 中所解释的,它非常简单,如下所示
The Julia package ecosystem already contains quite a few GPU-related
packages, targeting different levels of abstraction as Figure 1 shows.
At the highest abstraction level, domain-specific packages like
MXNet.jl and TensorFlow.jl can transparently use the GPUs in your
system. More generic development is possible with ArrayFire.jl, and if
you need a specialized CUDA implementation of a linear algebra or deep
neural network algorithm you can use vendor-specific packages like
cuBLAS.jl or cuDNN.jl. All these packages are essentially wrappers
around native libraries, making use of Julia’s foreign function
interfaces (FFI) to call into the library’s API with minimal overhead.
CUDAdrv 和 CUDAnative 包旨在直接使用 CUDA 运行时 API 并从 Julia 本身编写内核。我相信这就是 CuArray 派上用场的地方——粗略地说,将原生 Julia 对象包装成 CUDA 可访问格式。
另一方面,ArrayFire 是一个通用库,它将所有(cuBLAS、cuSparse、cuSolve、cuFFT)CUDA 提供的领域特定库封装到漂亮的接口(函数)中。除了与 CUDA 领域特定库的接口外,ArrayFire 本身在统计、图像处理、计算机视觉等领域提供了许多其他功能。它有很好的 JIT feature 用户代码被编译到运行时内核的地方 - 简单放。 ArrayFire.jl 是一种语言绑定,在包装器级别进行了一些额外的 Julia 特定改进。
这是一般的区别。从开发人员的角度来看,使用库(如 ArrayFire)基本上消除了跟上 CUDA API 和 maintaining/tweaking 内核以获得最佳性能的负担,我认为这需要很多时间。
PS。我是ArrayFire开发组的一员
我最近研究了GPU计算的使用,其中package的使用似乎很混乱。
例如,CuArrays 和 ArrayFire 似乎在做同样的事情,其中 ArrayFire 似乎是 Nvidia 开发人员网页上的 "official" 包。(https://devblogs.nvidia.com/gpu-computing-julia-programming-language )
此外,还有 CUDAdrv 和 CUDAnative 包...,这似乎令人困惑,因为它们的功能似乎不像其他包那么简单。
这些包有什么作用? CuArrays 和 ArrayFire 有区别吗?
正如您分享的博客 post 中所解释的,它非常简单,如下所示
The Julia package ecosystem already contains quite a few GPU-related packages, targeting different levels of abstraction as Figure 1 shows. At the highest abstraction level, domain-specific packages like MXNet.jl and TensorFlow.jl can transparently use the GPUs in your system. More generic development is possible with ArrayFire.jl, and if you need a specialized CUDA implementation of a linear algebra or deep neural network algorithm you can use vendor-specific packages like cuBLAS.jl or cuDNN.jl. All these packages are essentially wrappers around native libraries, making use of Julia’s foreign function interfaces (FFI) to call into the library’s API with minimal overhead.
CUDAdrv 和 CUDAnative 包旨在直接使用 CUDA 运行时 API 并从 Julia 本身编写内核。我相信这就是 CuArray 派上用场的地方——粗略地说,将原生 Julia 对象包装成 CUDA 可访问格式。
另一方面,ArrayFire 是一个通用库,它将所有(cuBLAS、cuSparse、cuSolve、cuFFT)CUDA 提供的领域特定库封装到漂亮的接口(函数)中。除了与 CUDA 领域特定库的接口外,ArrayFire 本身在统计、图像处理、计算机视觉等领域提供了许多其他功能。它有很好的 JIT feature 用户代码被编译到运行时内核的地方 - 简单放。 ArrayFire.jl 是一种语言绑定,在包装器级别进行了一些额外的 Julia 特定改进。
这是一般的区别。从开发人员的角度来看,使用库(如 ArrayFire)基本上消除了跟上 CUDA API 和 maintaining/tweaking 内核以获得最佳性能的负担,我认为这需要很多时间。
PS。我是ArrayFire开发组的一员