我正在嘗試並行化基於粒子模擬的代碼,並且遇到基於OpenMP的方法性能較差的問題。我的意思是:用於粒子模擬的並行化OpenMP代碼的性能不佳
- 使用Linux工具
top
顯示CPU使用率,運行CPU的OpenMP線程的平均使用率爲50%。 - 隨着線程數量的增加,加速收斂到約1.6倍。收斂速度非常快,即使用2個線程可以達到1.5的加速。
以下僞碼說明了所有並行區域的基本模板。注意,在單個時間步驟中,正在執行以下所示方式的5個平行區域。基本上,作用在粒子上的力是相鄰粒子j < NN(i)
的幾個場特性的函數。
omp_set_num_threads(ncpu);
#pragma omp parallel shared(quite_a_large_amount_of_readonly_data, force)
{
int i,j,N,NN;
#pragma omp for
for(i=0; i<N; i++){ // Looping over all particles
for (j=0; j<NN(i); j++){ // Nested loop over all neighbors of i
// No communtions between threads, atomic regions,
// barriers whatsoever.
force[i] += function(j);
}
}
}
我想弄清楚觀察到的瓶頸的原因。我的天真初步猜測爲一個解釋:
如上所述,線程之間共享大量的內存用於只讀訪問。不同的線程很可能會嘗試同時讀取相同的內存位置。這是否造成瓶頸?我應該讓OpenMP分配私人副本嗎?
這是*大量的數據*預先存儲,或者你從過程中的文件中讀取它? I/O將永遠在那裏摧毀人們的期望\ =正如您所說的,多次訪問同一個空間可能會導致抖動,因此設置一些訪問策略將會很好 – Rubens
謝謝。我不需要從文件中讀取它。它們在運行時生成並存儲在物理RAM中。 –
NN(i)是如何均勻分佈的?負載不平衡可能是一個問題嗎?您可以嘗試不同的時間表以供循環查看。否則,您需要使用分析器來查明您的時間花在哪裏;我非常喜歡[scalasca](http://www.scalasca.org)來解決OpenMP性能問題。 –