簡體   English   中英

在多核和並行處理上運行腳本

[英]Run a script on multi cores and parallel processing

我正在編寫一個腳本,該腳本從命令行獲取一系列參數

script.pl start end 

for ($k1=$start; $k1<$end; $k1 += 0.001) {
  for ($k2=$start; $k2<$end; $k2 += 0.01) {
    for ($k3=$start; $k3<$end; $k3 += 0.001) {
      for ($k4=$start; $k4<$end; $k4 += 0.001) {
        for ($k5=$start; $k5<$end; $k5 += 0.001) {
...

}}}}}

如果我將參數設置為0到1之間,則會花費很長時間。 最簡單的方法是將它們分成較小的間隔,例如

script.pl 0 0.01 
script.pl 0.01 0.02
...
script.pl 0.9 1

然后我必須同時打開100個屏幕!

有人可以指導我如何自動執行嗎?

由於這個原因,我不確定最好的方法是什么。 我有256核。

查看並行代碼時,真正關鍵的問題是依賴關系。 我將假設-因為您的腳本可以細分-您不會在循環內做任何復雜的事情。

但是,由於要逐步執行0.001個循環和5個循環,因此如果要從0到1,則只需要進行很多迭代。確切地說,是100,000,000,000,000。

為了並行化,我個人建議您“展開”外部循環並使用Parallel::ForkManager

例如

my $CPU_count = 256;

my $fork_manager = Parallel::ForkManager->new($CPU_count);

for ( my $k1 = $start; $k1 < $end; $k1 += 0.001 ) {
    # Run outer loop in parallel
    my $pid = $fork_manager->start and next;

    for ( my $k2 = $start; $k2 < $end; $k2 += 0.01 ) {
        for ( my $k3 = $start; $k3 < $end; $k3 += 0.001 ) {
            for ( my $k4 = $start; $k4 < $end; $k4 += 0.001 ) {
                for ( my $k5 = $start; $k5 < $end; $k5 += 0.001 ) {
                    ...;
                }
            }
        }
    }

    $fork_manager->end;
}

這樣做是-對於該“外部”循環的每次迭代,請分叉您的進程並作為單獨的進程運行4個內部循環。 上限為256個並發進程。 您應該將其與可用的CPU數量匹配。

不過請記住-這僅適用於瑣碎的“ cpu密集型”任務。 如果您要執行大量的磁盤IO或嘗試共享內存,則將無法正常工作。

還要注意-如果外部循環上的步數少於CPU數,則並行化效果將不太好。

我還要指出- $k2的迭代器較小。 我是從您的來源復制過來的,但這可能是錯字。

我不確定您的意思,但這會在后台並行啟動100個作業。 請注意,它可能會使您的計算機屈服,具體取決於您的硬件:

$ seq 0 0.02 0.99 | perl -lne 'print "$_ ",$_+0.01' | 
    while read start end; do script.pl $start $end; done; script.pl 0.99 1

這個想法是使用seq生成間隔,並通過一個小Perl腳本通過管道輸出這些間隔。 然后由bash循環讀取這些內容,並使用相關參數啟動腳本。

但是請注意,這絕不是實現目標的一種優雅方法。 您可能需要研究GNU Parallel或Perl本身可用的各種並行化工具。

Terdon答案的變體:

paste <(seq -w 0 .01 1) <(seq -w 0.01 0.01 1.01) | xargs -n2 -P 255 ./script.pl

將以下一種形式啟動255個paralell進程

./script.pl 0.00 0.01
./script.pl 0.01 0.02
...
...
./script.pl 0.98 0.99
./script.pl 0.99 1.00

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM