2
A
回答
0
倍頻支持通過是多線程庫在Linux上多線程。請參閱Get GNU Octave to work with a multicore processor. (Multithreading) Atlas通過Cyqwin支持Windows 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
相關問題
- 1. 有沒有什麼辦法可以從八度使用.net .dlls?
- 2. 有沒有什麼辦法,HTML音頻標籤可以在Firefox
- 3. 有沒有什麼辦法可以使使用cons在方案中緯度?
- 4. 有沒有什麼辦法可以在函數中使用get_sidebar?
- 5. 有沒有什麼辦法可以查看應用程序
- 6. 有沒有什麼辦法可以畫出這個圓梯度
- 7. 有沒有什麼辦法可以在iTunes中使用java評價歌曲?
- 8. 有沒有什麼辦法可以在我的程序中使用msinfo32.exe?
- 9. 有沒有什麼辦法可以讓這個java更小?
- 10. 有沒有什麼辦法可以在ScrollView之外使用SliverGrid?
- 11. 有沒有什麼辦法可以使用li:first-child和li:hover
- 12. 有沒有什麼辦法可以使用HttpUrlConncetion正確獲取上傳進度
- 13. 有沒有辦法指定八度的命令行寬度?
- 14. 有沒有辦法使用java就地更改地圖的鍵?
- 15. 有沒有什麼辦法可以用php的
- 16. 有沒有什麼辦法可以放大c#中的按鈕?
- 17. 有沒有什麼辦法可以「預編譯」Rails中的Markdown?
- 18. 在java中有沒有什麼辦法來使用和代替&&
- 19. 有沒有什麼方法可以重用java 8中的Stream?
- 20. 有沒有什麼辦法可以在非Activity類中使用openFileOutput()方法?
- 21. 有沒有辦法在八度腳本中矢量化sprintf()?
- 22. 有沒有什麼辦法給圖像使用CSS的邊框?
- 23. 有沒有什麼辦法可以訪問Java中的探戈pointcloud攝像頭圖像像素
- 24. 有沒有什麼辦法可以避免在java中嵌套的「for」循環
- 25. 有沒有什麼辦法可以用Tag Helper創建循環?
- 26. 有沒有什麼辦法可以用Sourcesafe創建配置項
- 27. 有沒有什麼辦法可以在eclipse中編譯GnuTLS?
- 28. 有沒有什麼辦法可以在windows phone中創建pdf
- 29. 有沒有什麼辦法可以在DataGrid中顯示CheckBox
- 30. 有沒有什麼辦法可以在jQuery中捕捉空間