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

#julia #arrayfire

#julia #arrayfire

Вопрос:

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

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

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

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

Комментарии:

1. Если вы не знаете, что выбрать, перейдите к Flux.jl: https://github.com/FluxML/Flux.jl

Ответ №1:

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

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

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

С другой стороны, ArrayFire — это универсальная библиотека, которая объединяет все (cuBLAS, cuSPARSE, cuSolve, cuFFT) библиотеки, предоставляемые CUDA для конкретного домена, в приятный интерфейс (функции). Помимо интерфейса к библиотекам, специфичным для домена CUDA, ArrayFire сам по себе предоставляет множество других функций в областях статистики, обработки изображений, компьютерного зрения и т.д. В нем есть хорошая функция JIT, при которой пользовательский код компилируется в ядро среды выполнения — проще говоря. ArrayFire.jl — это языковая привязка с некоторыми дополнительными улучшениями, специфичными для Julia, на уровне оболочки.

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

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