我读过,比较和分支在GPU上是缓慢的。我想知道多少钱。(我对OpenCL比较熟悉,但这个问题对于数据自动化系统,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分支和比较,但移植到GPU上是否值得呢?(也就是说,如果这4-5项比较比CPU上相同的4-5比较慢10倍,这将是一个瓶颈)if分支和比较,慢下来?我在这个液压删除代码中使用的代码:http://www.openprocessing.org/sketch/146982
发布于 2014-05-03 19:38:13
分支本身并不慢。分歧才是你想要的。GPU计算多个工作项(typ )。16或32)在“翘曲”或“波前”中的锁定步骤中,如果不同的工作项采用不同的路径,则它们都会选择所有的路径,但是gate会根据它们所处的路径(使用谓词标志)编写路径。因此,如果您的工作项目总是(或大部分)以相同的方式分支,那么您就很好了。如果他们不这样做,处罚就会打劫他们的表现。
发布于 2014-05-03 17:53:36
如果需要进行比较,如果数组长度'n‘真的很大,则可以使用约简代替顺序比较。约简将在O (log n)时间内并行地进行比较,而当按顺序进行时则与O (n)相反。
当您在GPU线程中顺序访问内存时,内存访问是连续的,因为连续的块是从同一个块访问的。相反,使用合并读取是很好的。在这方面你可以找到大量的例子。
在GPU上,不要多次访问全局内存(因为GPU内存管理和缓存的工作方式与CPU不同)。相反,尽可能地将全局内存元素缓存到线程的私有变量/共享内存中。
https://stackoverflow.com/questions/23447817
复制相似问题