MPI_RUBY 是一个MPI的ruby实现版本,它利用了ruby语言的一些强项来简化mpi编程。它不需要你管理在c++中
的buffer和datatype,它都是把要传递的数据当作对象。不管运行效率如何,它看起来很简洁,适合于在开发c++版本之前的原型开发&验证(我想这是有好处的)。我有意在机上安装一个,这就是本文的目的。
以下是一个例子:Allreduce所有的id
printf("Hello, I am %d of %d/n", MPI::Comm::WORLD.rank(), MPI::Comm::WORLD.size())
$rank = MPI::Comm::WORLD.rank()
$sum = MPI::Comm::WORLD.allreduce($rank, MPI::Op::SUM)
puts "sum of the ranks = #{$sum}"
注意:在这个环境下,它不需要什么MPI_Init 和 MPI_Finalize ,环境会帮我们搞定。
同时也不需要管理buffer&类型,而且它很面向对象的写法很不错!
另外一个例子:求PI
# Parallel computation of pi in Ruby
PI25DT = 3.141592653589793238462643
NINTERVALS = 10000
$rank = MPI::Comm::WORLD.rank()
$size = MPI::Comm::WORLD.size()
$startwtime = MPI.wtime()
$h = 1.0 / NINTERVALS
$sum = 0.0
($rank + 1).step(NINTERVALS, $size) do |i|
x = $h * (i - 0.5)
$sum += (4.0 / (1.0 + x**2))
end
mypi = $h * $sum
$pi = MPI::Comm::WORLD.reduce(mypi, MPI::Op::SUM, 0)
if $rank == 0 then
printf "pi is ~= %.16f, error = %.16f/n", $pi, ($pi - PI25DT).abs
$endwtime = MPI.wtime()
puts "wallclock time = #{$endwtime-$startwtime}"
end
看起来是不是很不错?!