2014-02-11 3 views
2

, следуйте за заголовком, я ищу способ, чтобы я мог использовать поток или что-то, что может ускорить мои вычисления в октаве.Есть ли способ, которым я могу использовать поток в октаве, как в java

У кого есть идея или функция или пакет ??? пожалуйста помогите. и FYI я использую окна 7.

ответ

0

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); 
} 
0

На Octave-Forge два пакета, касающиеся параллельных вычислений:

Это также можно породить подпроцессы, используя функцию fork().

Смежные вопросы