(続)複数のスレッドを使って並列にソートする際に必要なスレッド数を計算する

複数のスレッドを使って並列にソートする際に必要なスレッド数を計算する - 計算機と戯れる日々の続き

配線が交わってもいいなら必要なスレッド数は少なくなる。
rubyを使って自動でgraphvizのソース作成しコンパイルするプログラムを作った。

結果は以下。




ソースは以下。

n=6
m=n/2
f=open("a.dot","w")
f.puts <<HEAD
digraph plus {
 graph [rankdir=LR]
 node [shape=circle]

HEAD
1.upto(n){|y|
  f.puts " in#{y} [shape = box]"
  f.puts " in#{y}->p1_#{(y.to_f/2).ceil}"
}
1.upto(m-1){|x|
  1.upto(m){|y|
    f.puts " p#{x}_#{y}->p#{x+1}_#{1>y-1?1:y-1}[label=\"\"]"
    f.puts " p#{x}_#{y}->p#{x+1}_#{m<y+1?m:y+1}[label=\"\"]"
  }
}
m.upto(m*2-1){|x|
  1.upto(m*2-x){|y|
    if 1>y-1 then
      f.puts " out#{x-m+1} [shape = box]"
      f.puts " p#{x}_#{y}->out#{x-m+1}"
    else
      f.puts " p#{x}_#{y}->p#{x+1}_#{y-1}"
    end
    if m*2-x<=y then
      f.puts " out#{m*3-x} [shape = box]"
      f.puts " p#{x}_#{y}->out#{m*3-x}"
    else
      f.puts " p#{x}_#{y}->p#{x+1}_#{y}"
    end
  }
}
f.puts "}"
f.close
puts `dot -Tsvg -o a.svg a.dot`