光线跟踪算法中的分支预测函数

时间:2014-08-27 19:12:42

标签: cuda opencl gpu raytracing branch-prediction

有没有人在任何光线追踪碰撞测试内核(Cuda,Opencl)中尝试过用于GPU计算的自定义分支预测算法?

我是否应该担心低深度(2-5)的性能?

示例:

 trace for the first group of rays
     check for previous ray depth predictor, if zero, guess zero.
                                   if gt one, guess d>=1
           go one level deeper in tracing kernel.(with pseudo stack & recursivity)

                           recursively repeat

                     go out of one depth after saving guess state

                  recursively go out of depths.

这可以击败硬件级预测吗?这甚至可以使总跟踪时间更好吗?

此伪代码中的“if”句子不应包含任何“if”。因此,它只是根据预测值计算零或实际值。

感谢。

1 个答案:

答案 0 :(得分:1)

这来自OpenCL Optimization Manual

  

使用预测而不是控制流。预测允许   GPU可以并行执行两个执行路径   比通过聪明的方式尽量减少工作更快   控制流。这样做的原因是,如果没有内存操作   存在于一个?:运算符(也称为三元运算符)中   操作被翻译成单个cmov_logical指令,其中   在一个循环中执行。一个例子是:

     

If (A>B) { C += D; } else { C -= D; }

     

将其替换为:

     

int factor = (A>B) ? 1:-1; C += factor*D;

     

在第一个代码块中,这转换为IF / ELSE / ENDIF   条件码序列,每个约需要8个周期。如果发散,   此代码在~36个时钟内执行;否则,在~28个时钟。分店   不花费四个周期(一个指令槽);一个分支   增加了四个延迟时隙来从指令中获取指令   缓存,总共16个时钟。由于执行掩码已保存,   然后修改,然后为分支恢复,当添加~12个时钟   发散,~8时钟没有。

     

在第二段代码中,?:   运算符以向量单位执行,因此没有额外的CF指令   产生。由于指令是顺序依赖的,所以   代码块在12个周期内执行,速度提高1.3倍。至   看到这一点,第一个循环是(A> B)比较,其结果   输入到第二个循环,这是cmov_logical因子,bool,   1,-1。最后一个循环是一个MAD指令:mad C,factor,D,C。   如果条件代码和ALU指令之间的比率很低,   这是一个很好的模式来删除控制流程。

好像你的0/1选择可能基于预测。不确定这是否是你要找的。

来源:http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/opencl-optimization-guide/