Путаница с пакетами графических процессоров Nvidia в Julia, CuArrays и ArrayFire

Недавно я изучал использование вычислений на графическом процессоре, где использование пакета казалось запутанным.

Например, CuArrays и ArrayFire, казалось, делали одно и то же, тогда как ArrayFire казался «официальным» пакетом на веб-странице разработчиков Nvidia.(https://devblogs.nvidia.com/gpu-computing-julia-programming-language )

Кроме того, были пакеты CUDAdrv и CUDAnative..., которые, казалось, сбивали с толку, поскольку их функциональность казалась не такой простой, как другие.

Что делают эти пакеты? Есть ли разница между CuArrays и ArrayFire?


person J C    schedule 24.03.2019    source источник
comment
Если вы не знаете, что выбрать, перейдите на Flux.jl: https://github.com/FluxML/Flux.jl   -  person Przemyslaw Szufel    schedule 25.03.2019


Ответы (1)


Как объясняется в сообщении в блоге, которым вы поделились, это довольно просто, как указано ниже.

Экосистема пакетов Julia уже содержит довольно много пакетов, связанных с GPU, ориентированных на разные уровни абстракции, как показано на рис. 1. На самом высоком уровне абстракции доменные пакеты, такие как MXNet.jl и TensorFlow.jl, могут прозрачно использовать графические процессоры в вашей системе. Более общая разработка возможна с ArrayFire.jl, и если вам нужна специализированная реализация CUDA линейной алгебры или алгоритма глубокой нейронной сети, вы можете использовать пакеты для конкретного поставщика, такие как cuBLAS.jl или cuDNN.jl. Все эти пакеты, по сути, являются оболочками для нативных библиотек, использующими интерфейсы внешних функций (FFI) Julia для вызова API библиотеки с минимальными накладными расходами.

Пакеты CUDAdrv и CUDAnative предназначены для прямого использования CUDA runtime API и написания ядер из самой Джулии. Я считаю, что именно здесь CuArray пригодится - грубо говоря, обернув собственные объекты Julia в формат, доступный для CUDA.

ArrayFire, с другой стороны, является универсальной библиотекой, которая объединяет все (cuBLAS, cuSparse, cuSolve, cuFFT), предоставленные CUDA для предметной области, в приятный интерфейс (функции). Помимо интерфейса для доменных библиотек CUDA, ArrayFire сам по себе предоставляет множество других функций в области статистики, обработки изображений, компьютерного зрения и т.д. -arrayfire-jit-code-generation/" rel="nofollow noreferrer">функция JIT, при которой пользовательский код компилируется в исполняемое ядро ​​- проще говоря. ArrayFire.jl — это языковая привязка с некоторыми дополнительными специфическими для Julia улучшениями на уровне оболочки.

Это общая разница. С точки зрения разработчика, использование библиотеки (например, ArrayFire) в основном избавляет от необходимости поддерживать API CUDA и поддерживать/настраивать ядра для оптимальной производительности, что, как мне кажется, занимает много времени.

PS. Я являюсь членом команды разработчиков ArrayFire.

person pradeep    schedule 25.03.2019