解釋有點複雜,但我們現在就去。基本上,問題是「如何以有效的方式將問題分解爲子問題」。這裏的「高效」意味着,破碎的子問題儘可能大。基本上,如果我根本不需要解決問題,那將是理想的。但是,因爲工人只能在特定的問題上工作,所以我需要分手。但我想找到儘可能粗糙的方法。分配工作的高效算法?
下面是一些僞代碼..
我們有這樣的問題(對不起這是在Java中,如果你不明白,我會很高興來解釋)。
class Problem {
final Set<Integer> allSectionIds = { 1,2,4,6,7,8,10 };
final Data data = //Some data
}
而且一個子問題是:
class SubProblem {
final Set<Integer> targetedSectionIds;
final Data data;
SubProblem(Set<Integer> targetedSectionsIds, Data data){
this.targetedSectionIds = targetedSectionIds;
this.data = data;
}
}
工作將這個樣子,然後。
class Work implements Runnable {
final Set<Section> subSections;
final Data data;
final Result result;
Work(Set<Section> subSections, Data data) {
this.sections = SubSections;
this.data = data;
}
@Override
public void run(){
for(Section section : subSections){
result.addUp(compute(data, section));
}
}
}
現在我們有「工人」的情況下,有自己的狀態sections I have
。
class Worker implements ExecutorService {
final Map<Integer,Section> sectionsIHave;
{
sectionsIHave = {1:section1, 5:section5, 8:section8 };
}
final ExecutorService executor = //some executor.
@Override
public void execute(SubProblem problem){
Set<Section> sectionsNeeded = fetchSections(problem.targetedSectionIds);
super.execute(new Work(sectionsNeeded, problem.data);
}
}
phew。
所以,我們有很多Problem
s和Workers
不斷要求更多。我的任務是將分解爲SubProblem
並提供給他們。然而,難點在於我必須稍後收集SubProblems的所有結果,並將它們合併(減少)爲整個Problem
的Result
。然而,這是昂貴的,所以我想給工人儘可能大的「塊」(儘可能多的targetedSections
)。
它不一定是完美的(數學上儘可能高效或者什麼的)。我的意思是,我想不可能有完美的解決方案,因爲你無法預測每次計算需要多長時間,等等。但是有沒有一個很好的啓發式解決方案?或者,也許我可以在設計之前閱讀一些資源?
任何意見是高度讚賞!
編輯: 我們也控制部分分配,所以控制這是另一種選擇。基本上,對此的唯一限制是工人只能有固定數量的部分。
我真的不知道它是否適用,因爲我沒有足夠的瞭解它,但叉/加入似乎是這樣做的算法。 http://www.ibm.com/developerworks/java/library/j-jtp11137.html – nicerobot 2010-03-27 21:50:45
謝謝。我試圖讓我的頭在附近。但問題是,即使我使用這個框架,我仍然必須提供分割任務的邏輯等等。所以我仍然會遇到這個問題。 – 2010-03-27 22:42:08
分佈式計算當然是一項不平凡的任務,而且一個活動高性能計算(HPC)研究領域。一本體面的大學文本是McGraw-Hill的Michael Quinn的「用MPI和OpenMP編寫C語言的並行編程」ISBM 0-07-282256-2 – 2010-03-28 03:59:05