【发布时间】:2014-06-20 07:11:15
【问题描述】:
我读到 GPU 上的比较和分支很慢。我想知道多少钱。 (我对 OpenCL 比较熟悉,但这个问题对于 CUDA、AMP 也很普遍……)
在我开始将我的代码移植到 GPU 之前,我想知道它。特别是我有兴趣找到 2D 数组中每个点的 邻域中的最低值(4 或 9 个最近邻)。即类似卷积的东西,但我需要比较和分支,而不是求和和乘法。
例如这样的代码(注意:此示例代码尚未针对 GPU 进行优化以提高可读性...因此分区到工作组,本地内存的预传...缺失)
for(int i=1;i<n-1;i++){ for(int j=1;j<n-1;j++){ // iterate over 2D array
float hij = h[i][j];
int imin = 0,jmin = 0;
float dh,dhmin=0;
// find lowest neighboring element h[i+imin][j+jmin] of h[i][j]
dh = h[i-1][j ]-hij; if( dh<dhmin ){ imin = -1; jmin = 0; dhmin = dh; }
dh = h[i+1][j ]-hij; if( dh<dhmin ){ imin = +1; jmin = 0; dhmin = dh; }
dh = h[i ][j-1]-hij; if( dh<dhmin ){ imin = 0; jmin = -1; dhmin = dh; }
dh = h[i ][j+1]-hij; if( dh<dhmin ){ imin = 0; jmin = +1; dhmin = dh; }
if( dhmin<-0.00001 ){ // if lower
// ... Do something with hij, dhmin and save to h[i+imin][j+jmin] ...
}
} }
- 尽管有很多
if分支和 比较? (即,如果每个元素的 4-5 次比较比 CPU 上相同的 4-5 次比较慢 10 倍,这将是一个瓶颈) - 是否有任何优化技巧如何最小化
if分支和比较变慢了?
我在这个液压腐蚀代码中使用的: http://www.openprocessing.org/sketch/146982
【问题讨论】:
-
我建议您查看@talonmies 对问题Is Branch Divergence Really So Bad? 的评论,它有效地总结了问题点。
-
对于你的情况,继续,ifs 并没有真正转移这么多。