Ответ 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 одновременных потоков. Если вы слишком долго ожидаете выполнения процесса, скорее всего, самые низкие висячие фрукты, чтобы ускорить его, - это использовать более эффективный алгоритм или структуру данных.