cuda - GPU 上的比较和分支有多慢

标签 cuda opencl gpgpu

我读到 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/

相关文章:

parallel-processing - 并行处理对大型数据集的顺序任务的多次评估——GPU 计算的任务?

opencl - 未能初始化 opencl 向量文字

c++ - 在输出中混合推力和 cuBLAS 意外结果

c++ - 与内存相关的莫名其妙的cuda行为

python - 从 Python 内核调用 C++ CUDA 设备函数

opencl - float VS float N

c++ - 统一内存分配cuda的功能关键字

cuda - 使用 NVIDIA GPU 计算 SDK 4.0 和 microsoft VC++ 2010 Express 无需 GPU 硬件即可执行简单的 CUDA 程序

language-agnostic - GPGPU 是黑客吗?

python - 在 windows 上为 gpu 安装 Theano - 怀疑是 nvcc 版本问题