Получите GNU Octave для работы с многоядерным процессором. (Многопоточность) - программирование

Получите GNU Octave для работы с многоядерным процессором. (Многопоточность)

Я хочу иметь возможность программировать несколько потоков с октавой gnu, чтобы использовать несколько процессоров.

Я установил GNU Octave на Fedora 17 Linux и сделал следующее:

yum install octave

Какая установлена ​​на моем компьютере последняя версия октавы, 3.6.2. Он отлично работает, однако, когда вы умножаете две огромные матрицы вместе, он борется с одним процессором, который использует октава. Было бы неплохо, если бы в матричном умножении использовались все ядра, так как в этом случае CPU, очевидно, является узким местом.

Может ли октава полностью использовать многоядерные процессоры и работать на нескольких потоках? Есть ли библиотека или флаг времени компиляции для этого?

4b9b3361

Ответ 1

Решение

Октава - однопоточное приложение, работающее на одном ядре. Вы можете получить октаву, чтобы использовать некоторые библиотеки, такие как ATLAS, которые используют несколько ядер. Таким образом, в то время как Octave использует только одно ядро, когда вы сталкиваетесь с тяжелой работой, октавные вызовы выполняют функции в ATLAS, которые используют много процессоров.

Я смог это сделать. Сначала скомпилируйте "ATLAS" из исходного кода и сделайте его доступным для вашей системы, чтобы октава могла найти его и использовать эти функции библиотеки. ATLAS настраивается на вашу систему и количество ядер. Когда вы устанавливаете октаву из источника и указываете ATLAS, она использует ее, поэтому, когда октава выполняет тяжелую операцию, например огромное умножение матрицы, ATLAS решает, сколько процессоров использовать.

Мне не удалось заставить это работать для Fedora, но в Gentoo я мог заставить его работать.

Я использовал эти две ссылки: ftp://ftp.gnu.org/gnu/octave/

http://math-atlas.sourceforge.net/

Я запускал следующее октавное ядро ​​до и после установки ATLAS:

tic
bigMatrixA = rand(3000000,80);
bigMatrixB = rand(80,30);
bigMatrixC = bigMatrixA * bigMatrixB;
toc
disp("done");

Матричное умножение происходит намного быстрее, используя несколько процессоров, что в 3 раза быстрее, чем раньше, с одним ядром:

Without Atlas: Elapsed time is 3.22819 seconds.
With Atlas:    Elapsed time is 0.529 seconds.

Три библиотеки, которые я использую, которые ускоряют работу blas-atlas cblas-atlas lapack-atlas.

Если октава может использовать их вместо стандартного blas и lapack libraries, тогда он будет использовать многоядерные ядра.

Это непросто и требует некоторого навыка программирования, чтобы получить октаву для компиляции из источника с помощью ATLAS.

Откат от использования Atlas:

Это программное обеспечение Atlas использует много накладных расходов для разделения вашей октавной программы на несколько потоков. Конечно, это происходит намного быстрее, если все, что вы делаете, это огромные умножения матриц, но большинство команд не могут быть многопоточными по атласу. Если извлечение каждого бита вычислительной мощности/скорости из ваших ядер является главным приоритетом, вам будет гораздо лучше удача просто написать вашу программу для запуска параллельно с самим собой. (Разделите свою программу на 8 эквивалентных программ, которые работают по 1/8 проблемы и запускают их все одновременно, когда все будет сделано, соберите результаты).

Atlas помогает одиночной программе с октавной резьбой, которая немного походит на многопоточное приложение, но это не серебряная пуля. Atlas не сделает вашу однопоточную программу Octave максимальной из вашего 2,4,6,8-процессорного ядра. Вы заметите повышение производительности, но повышение ускорит поиск лучшего способа использования всего процессора. Ответ заключается в том, что ваша программа запускается параллельно с собой, и это требует много навыков программирования.

Предложение

Поместите свою энергию в векторизацию ваших самых тяжелых операций и распределите процесс по n одновременных потоков. Если вы слишком долго ожидаете выполнения процесса, скорее всего, самые низкие висячие фрукты, чтобы ускорить его, - это использовать более эффективный алгоритм или структуру данных.

Ответ 2

В Octave-Forge находятся два пакета, посвященных параллельным вычислениям:

Также возможно порождать подпроцессы с помощью функции fork().

Ответ 3

Как было предложено Эриком, я попытался использовать ATLAS, и он улучшил мою производительность 3 раза (в приложении для обучения NN, основная стоимость - матричное умножение). Удивительно, но казалось, что нужно использовать только одно ядро. После дальнейших исследований я наткнулся на OpenBLAS, и он начал использовать несколько ядер из коробки и улучшил производительность еще 2 раза (хотя у меня было только 2 ядра). Если вы хотите выжать больше, вы также можете попробовать использовать MKL, но он тяжелый на диске из-за зависимостей.

Я использовал Arch Linux с сообществом пакетов / atlas-lapack-base и aur/ openblas-lapack. Установка каждого из них включала значение по умолчанию, используемое в Octave.

Вот хороший тест, сравнивающий эти библиотеки: http://www.tcm.phy.cam.ac.uk/~mjr/linpack/