Cuda 光线跟踪算法中的分支预测函数
有没有人在任何光线跟踪碰撞测试内核(Cuda、Opencl)中尝试过用于GPU计算的自定义分支预测算法 我是否应该担心低深度(2-5)的性能 例如:Cuda 光线跟踪算法中的分支预测函数,cuda,opencl,gpu,raytracing,branch-prediction,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
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”。因此它仅根据预测值计算零或实际值
谢谢。这是来自:
使用预测而不是控制流。谓词允许
GPU并行执行两条执行路径,可以
比试图通过巧妙的方法最小化工作量更快
控制流量。原因是如果没有内存操作
存在于?:运算符(也称为三元运算符)中
操作被转换为单个cmov_逻辑指令,该指令
在单个循环中执行。这方面的一个例子是:
If(A>B){C+=D;}else{C-=D;}
将其替换为:
int-factor=(A>B)?1:-1; C+=系数*D代码>
在第一段代码中,这将转换为IF/ELSE/ENDIF
条件码序列,每个周期约为8个周期。如果有分歧,
该代码在36个时钟内执行;否则,在约28个时钟内。枝干
未采取的成本为四个周期(一个指令槽);枝
添加四个延迟槽以从指令中提取指令
缓存,总共16个时钟。由于执行掩码已保存,
然后对分支进行修改,然后恢复,当
发散,不发散时约8个时钟
在第二段代码中,是?:
运算符以向量单位执行,因此不需要额外的CF指令
生成。由于指令是顺序相关的,因此
代码块以12个周期执行,速度提高1.3倍。到
见此,第一个循环是(A>B)比较,其结果
是第二个循环的输入,即cmov_逻辑因子bool,
1, -1. 最后一个循环是MAD指令:MAD C,factor,D,C。
如果条件代码和ALU指令之间的比率较低,
这是移除控制流的一个好模式
看起来你的0/1选择可能基于预测。不确定这是否是你要找的
资料来源: