我应该在ruby中实现一个非常简单的MPI版本(或者更确切地说是模拟行为)。 部分任务是创建一个具有的Communicator类 在不同主机上运行的不同进程。 为了证明进程的“独立性”,两个连续的for循环遍历存储进程的数组,应该以不同的顺序输出它们。
进程应表示为我编写的类的实例或线程。 对于第一部分,我刚刚创建了一个具有所需属性的类,并在每次调用后更改了“each”方法以对进程列表进行洗牌。
然而,我正在与第二部分打交道。现在我刚刚创建了Thread的子类并添加了必需的属性和方法。我只需根据需要在块中创建无限循环的子类实例,并将它们存储在数组中。 现在,在循环遍历数组时,进程似乎有不同的响应时间,但仍然按顺序写入控制台。
由于我对我的方法是否正确有疑问,我想就如何实现所需行为提出一些建议:
for process in communicator write rank
for process in communicator write rank
> 1
> 2
> 3
#####
> 3
> 1
> 2
编辑:
传播者:
class ThreadKomunikator
attr_reader :hosty, :procesy, :rankPool
@@rankPool = (0..100).to_a.reverse
public
def initialize(hosty)
@procesy = []
@hosty = hosty
hosty.each do |name, number|
for i in 1..number
tempProc = ThreadProc.new{while true do continue; end;}
tempProc.init(getRank(),name)
procesy << tempProc
end
end
end
def MPI_Comm_size()
procesy.length
end
def each
procesy.each do |proces|
yield proces
end
# #procesy.shuffle!
end
def [](x)
procesy.each do |proces|
if proces.rank == x
return proces.MPI_Get_processor_name()
end
end
return "No process of that rank found!"
end
def method_missing(method, *args, &block)
if hosty.has_key?("#{method}")
return hosty["#{method}"]
else
return 0
end
end
private
def getRank
@@rankPool.pop
end
end
Thread的子类:
class ThreadProc< Thread
attr_accessor :rank, :host
def init(rank, host)
@rank = rank
@host = host
end
def MPI_Comm_rank()
@rank
end
def MPI_Get_processor_name()
@host
end
end