AccelerEyes объявила в декабре 2012 года, что она работает с Mathworks по коду GPU и прекратила выпуск своего продукта Jacket для MATLAB:
http://blog.accelereyes.com/blog/2012/12/12/exciting-updates-from-accelereyes/
К сожалению, они больше не продают лицензии Jacket.
Насколько я понимаю, решение ArrayFire на основе массива Jacket GPU было намного быстрее, чем решение gpuArray, предоставленное MATLAB.
Я начал работать с gpuArray, но вижу, что многие функции реализованы плохо. Например, простой
myArray(:) = 0
очень медленный. Я написал несколько пользовательских ядер CUDA, но плохо реализованная стандартная функциональность MATLAB добавляет много накладных расходов, даже если она постоянно работает с gpuArrays. Я исправил некоторые проблемы, заменив код MATLAB на написанный вручную код CUDA, но я не хочу переопределять стандартные функции MATLAB.
Еще одна особенность, которую мне не хватает, - это разреженные матрицы графических процессоров.
Итак, мои вопросы:
Как ускорить неудачно реализованные реализации GPU по умолчанию, предоставляемые MATLAB? В частности, как ускорить работу с разреженной матрицей в MATLAB с помощью GPU?
MATLAB поддерживает графический процессор на базе CUDA. Вы должны получить к нему доступ из "Parallel Computing Toolbox". Надеюсь, эти 2 ссылки также помогут:
Возможности Parallel Computing Toolbox
Основные функции
- Параллельные for-loops (parfor) для запуска задач-параллельных алгоритмов на нескольких процессорах
- Поддержка графических процессоров NVIDIA с поддержкой CUDA
- Полное использование многоядерных процессоров на рабочем столе с помощью рабочих, которые запускаются локально
- Поддержка компьютерных кластеров и сетей (с распределенным вычислительным сервером MATLAB)
- Интерактивное и пакетное выполнение параллельных приложений
- Распределенные массивы и однопроцессорные множественные данные (spmd) для обработки больших данных и параллельных алгоритмов данных
Поддержка графической платформы MATLAB для графических процессоров NVIDIA с поддержкой CUDA
Использование MATLAB для GPU-вычислений позволяет ускорить ваши приложения с помощью графических процессоров легче, чем с помощью C или Fortran. Благодаря знакомому языку MATLAB вы сможете использовать вычислительную технологию CUDA GPU без необходимости изучать тонкости архитектур графического процессора или низкоуровневые вычислительные библиотеки GPU.
Вы можете использовать графические процессоры с MATLAB через Parallel Computing Toolbox, который поддерживает:
- графические процессоры NVIDIA с поддержкой CUDA с возможностью вычисления 2.0 или выше. Для релизов 14a и ранее достаточно вычислительной способности 1.3.
- Использование графического процессора непосредственно из MATLAB
- функции MATLAB с поддержкой GPU, такие как fft, filter и несколько операций с линейной алгеброй
- Функции с поддержкой GPU в панелях инструментов: Инструментальная панель обработки изображений, Инструментальная панель системы обмена сообщениями, Инструментарий статистики и машинного обучения, Набор инструментов нейронной сети, Системы фазированных массивов Toolbox и Toolbox Toolbox (Подробнее о поддержке GPU для алгоритмов обработки сигналов).
- Интеграция ядра CUDA в приложениях MATLAB, используя только одну строку кода MATLAB
- Несколько графических процессоров на рабочих столах и компьютерах с использованием рабочих MATLAB в Parallel Computing Toolbox и MATLAB Distributed Computing Server
Я имел удовольствие посещать разговор Джона, основателя AccelerEyes. Они не получили ускорение, потому что они просто удалили плохо написанный код и заменили его кодом, который сохранял несколько бит здесь и там. Их ускорение в основном заключалось в использовании доступности кеша и выполнении большого количества операций в оперативной памяти (GPU). Matlab полагался на передачу данных между GPU и CPU, если я правильно помню, и, следовательно, ускорение было сумасшедшим.
myArray(:) = 0
медленный - он перемещает множество нулей из процессора в графический процессор без причины. Это не означает, что возможности MATLAB GPU реализованы плохо, это означает, что вам нужно знать, как их использовать; вместо этого попробуйтеmyArray = gpuArray.zeros(size(myArray))
.