簡體   English   中英

OpenGL Compute着色器更快地分離循環

[英]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毫秒)才能運行。 所以,

  1. 的確,對於現代硬件(GL4.3 +),對於本地線程中可變長度的循環,仍需要在繼續之前全部完成,並且
  2. 如果是這樣,為什么第二個代碼比較慢?

非常感謝你。

編輯: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM