有没有人在任何光线追踪碰撞测试内核(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”。因此,它只是根据预测值计算零或实际值。
感谢。
答案 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选择可能基于预测。不确定这是否是你要找的。 p>