Octave поддерживает многопоточность в Linux через библиотеки, которые многопоточны. См. Get GNU Octave to work with a multicore processor. (Multithreading) Atlas поддерживает Windows через Cyqwin http://math-atlas.sourceforge.net/faq.html#where Я использовал библиотеки на Gentoo Linux и имел некоторые улучшения скорости при запуске отдельных процессов. Библиотеки автоматически делят некоторые операции между несколькими процессорами. Разумеется, это не оптимальное решение, поскольку оно работает только при работе с очень большими матрицами. Это также может быть сложно запустить в Windows. Я знаю, что у меня были проблемы с Linux. При настройке библиотек не используйте несколько заданий для компиляции (см. Ваши документы компилятора). Он терпел неудачу каждый раз, когда я это пробовал.
Лучшее решение, если вы можете разделить проблему на более мелкие проблемы, которые не зависят друг от друга, так что их порядок исполнения не имеет значения. Я написал небольшой скрипт Perl, чтобы разбить несколько вызовов на Octave с кусками проблемы, поскольку Octave не имеет собственного способа создания потоков. Поскольку вы находитесь в Windows, вам понадобятся некоторые корректировки, если вы не используете его из Cyqwin.
#!/usr/bin/perl -wT
$ENV{PATH} = "/bin:/usr/bin:/usr/local/bin";
use strict;
use POSIX qw(setsid :sys_wait_h);
use Time::Piece;
use Time::Local;
#------------------- GLOBALS -----------------------
my $go_me = 0;
my $kid = 0;
my $kid_pid = 0;
my $num_children = 0;
#------------- SUBROUTINES ----------------------
sub Interrupt
{ $go_me = 0; }
sub Interrupt_Die
{
$go_me = 0;
print localtime . " > $$ - Dieing: @_ $!\n";
exit(0);
}
sub Child_Is_Done
{ $num_children++; }
#------------------ PROCESS OVERHEAD -------------------------
if($#ARGV != 1)
{
print "Usage: octbatch /path/filename [concurrency number]\n";
exit(0);
}
my $stdout_file = "";
if($ENV{HOME} =~ m/^(\/home\/\w+)$/)
{
$stdout_file = "$1" . '/octbatch.log';
}
else
{
print "Invalid value for $ENV{HOME}\nDon't run as root.\n";
exit(0);
}
open STDIN,'/dev/null' or die "Can't read /dev/null: $!";
open STDOUT,'>',$stdout_file or die "Can't write to $stdout_file: $!";
open(STDERR, ">&STDOUT") or die "Can't write to $stdout_file: $!";
defined(my $pid = fork) or die "Can't fork: $!";
exit if $pid;
setsid or die "Can't start a new session: $!";
my $parent = "$$";
print "Parent process is: $parent\n";
$go_me = 1;
print localtime . " > $$ - Starting.\n";
#----------------------- MAIN CYCLE ---------------------------------
my $filename = $ARGV[0];
unless(open(COMMANDFILE, "<$filename"))
{ die "Could not open $filename $!\n"; }
$num_children = $ARGV[1];
$SIG{'CHLD'} = 'Child_Is_Done';
while($go_me and my $line = <COMMANDFILE>)
{
if($num_children <= 0 and $kid_pid)
{
my $child_pid = -1;
$child_pid = wait();
if(WIFEXITED($?))
{ print localtime . " > $$ - Process $child_pid exited\n"; }
}
chomp($line);
print localtime . " > $$ - Running $line\n";
$num_children--;
Interrupt_Die("Can't fork!") unless defined($kid_pid = fork());
if($kid_pid)
{
print localtime . " > $$ - I am the parent.\n";
$SIG{'CHLD'} = 'Child_Is_Done';
}
else
{
print localtime . " > $$ - I am the child.\n";
$go_me = 0;
$kid = 1;
print localtime . " > $$ - Running $line\n";
if($line =~ m/^(octave ([^;\n\r]+))$/)
{
$line = "$1";
system("$line");
}
else
{
print localtime . " > $$ - Invalid line. Skipping.\n";
}
}
}
if($kid)
{
print localtime . " > $$ - Process $$ exited\n";
exit(0);
}
else
{
my $child_pid = -1;
do
{
$child_pid = waitpid(-1,0);
if(WIFEXITED($?))
{ print localtime . " > $$ - Process $child_pid exited\n"; }
} while($child_pid > 0);
print localtime . " > $$ - Stopping: $!\n";
exit(0);
}