我實施巴恩斯小屋算法爲N體問題的一個多線程溶液線程的數目。多線程應用程序運行時增加與
Main類執行以下操作
public void runSimulation() {
for(int i = 0; i < numWorkers; i++) {
new Thread(new Worker(i, this, gnumBodies, numSteps)).start();
}
try {
startBarrier.await();
stopBarrier.await();
} catch (Exception e) {e.printStackTrace();}
}
的bh.stop-和bh.startBarrier是CyclicBarriers設置開始和停止時間以System.nanoTime();達到時(屏障行動)。
工人運行方法:
public void run() {
try {
bh.startBarrier.await();
for(int j = 0; j < numSteps; j++) {
for(int i = wid; i < gnumBodies; i += bh.numWorkers) {
bh.addForce(i);
bh.moveBody(i);
}
bh.barrier.await();
}
bh.stopBarrier.await();
} catch (Exception e) {e.printStackTrace();}
}
addForce(I)經過一棵樹,做一些計算。它不影響任何共享變量,因此不使用同步。 O(NlogN)。
moveBody(I)不會在一個元件上的計算並且不使用同步。上)。
當達到bh.barrier,與所有機構一棵樹建成(屏障作用)。
現在來解決問題。運行時隨線程數的增加而線性增加。 運行時用於gnumBodies = 240,numSteps = 85000和四芯:
- 1螺紋= 0.763
- 2個線程= 0.952
- 3線程= 1.261
- 4線程= 1.563
爲什麼運行時不會隨着使用的線程數量而減少?
編輯:添加硬件信息
我不認爲我們可以說沒有看到'addForce'和'moveBody'的代碼實際上做了什麼有用的東西。 –