我读到 GPU 上的比较和分支速度很慢。我想知道多少钱。 (我更熟悉 OpenCL,但这个问题对于 CUDA、AMP 来说也很普遍......)
在开始将代码移植到 GPU 之前,我想知道这一点。我特别感兴趣的是寻找二维数组中每个点的邻域最低值(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
分支和比较速度变慢?
我在这个液压腐 eclipse 代码中使用了它: http://www.openprocessing.org/sketch/146982
最佳答案
分支本身并不慢。分歧才是你的目标。 GPU 以“扭曲”或“波前”的锁步方式计算多个工作项(通常为 16 或 32),如果不同的工作项采用不同的路径,它们都会采用所有路径,但门根据它们所在的路径进行写入(使用谓词标志))。因此,如果您的工作项目始终(或大部分)以相同的方式分支,那么您就很好。如果他们不这样做,处罚可能会影响他们的表现。
关于cuda - GPU 上的比较和分支有多慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23447817/