首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPU上的比较和分支有多慢?

GPU上的比较和分支有多慢?
EN

Stack Overflow用户
提问于 2014-05-03 17:41:57
回答 2查看 2.4K关注 0票数 2

我读过,比较和分支在GPU上是缓慢的。我想知道多少钱。(我对OpenCL比较熟悉,但这个问题对于数据自动化系统,AMP .)

我想知道,在我开始将我的代码移植到GPU之前。特别是,我感兴趣的是找到2D数组中每个点的邻域(4或9个最近邻)中的最低值。例如,像卷积,但不是求和和相乘,我需要比较和分支。

例如,这样的代码(注意:这个示例代码还没有被优化以使GPU更易于阅读.所以划分到工作组,预演本地内存.失踪)

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2014-05-03 19:38:13

分支本身并不慢。分歧才是你想要的。GPU计算多个工作项(typ )。16或32)在“翘曲”或“波前”中的锁定步骤中,如果不同的工作项采用不同的路径,则它们都会选择所有的路径,但是gate会根据它们所处的路径(使用谓词标志)编写路径。因此,如果您的工作项目总是(或大部分)以相同的方式分支,那么您就很好了。如果他们不这样做,处罚就会打劫他们的表现。

票数 5
EN

Stack Overflow用户

发布于 2014-05-03 17:53:36

如果需要进行比较,如果数组长度'n‘真的很大,则可以使用约简代替顺序比较。约简将在O (log n)时间内并行地进行比较,而当按顺序进行时则与O (n)相反。

当您在GPU线程中顺序访问内存时,内存访问是连续的,因为连续的块是从同一个块访问的。相反,使用合并读取是很好的。在这方面你可以找到大量的例子。

在GPU上,不要多次访问全局内存(因为GPU内存管理和缓存的工作方式与CPU不同)。相反,尽可能地将全局内存元素缓存到线程的私有变量/共享内存中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23447817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档