[英]OpenGL Compute shader seperate for loops faster
我最近開始涉足GPGPU,並編寫了一個MD模擬程序作為類分配。 從其他粒子計算力的部分如下。
vec3 pn = poss[gid].xyz;
vec3 f = vec3(0, 0, 0);
for (uint i = 0; i < gid; i++) {
f += df(pn, poss[i].xyz);
}
for (uint i = gid+1; i < num; i++) {
f += df(pn, poss[i].xyz);
}
fors[gid].xyz = f;
在GTX960上使用32000個實例(500個線程)運行此代碼需要50毫秒。
我的老師建議合並兩個循環,因為線程同步(?)會導致執行時間較長。 所以我將其更改為如下。
for (uint i = 0; i < num; i++) {
if (i != gid) f += df(pn, poss[i].xyz);
}
但是,這需要65毫秒(長15毫秒)才能運行。 所以,
非常感謝你。
編輯: df將為同一粒子返回無窮大,因此刪除條件表達式不是一個選擇。
1)好吧,我仍然是計算着色器的新手,但我認為是。 如果單個工作組中的不同調用對循環執行變量lenth,則某些線程可能更早完成,並且將不得不等待,直到所有線程在該特定工作組中完成執行。 之后,工作組可能會交換為另一個未處理的工作組。
2)因為兩個代碼不相同。 等效地,我的意思是相同的陳述。 上面的有2個循環。 下面的代碼有1個大循環,其中帶有“ if”語句。 所以我的猜測是If語句導致更長的運行時間。
如果您可以通過在索引gid
數組poss
中添加另一個向量來刪除“ If”語句,以便在處理gid
將處理后添加到f
的向量為vec3(0,0,0)
,那么我認為它將改善執行時間處理時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.