我正在使用cuda进行开发并且存在算术问题,我可以使用或不使用warp diverengence来实现。 对于扭曲分歧,它看起来像:
float v1;
float v2;
//calculate values of v1 and v2
if(v2 != 0)
v1 += v2*complicated_math();
//store v1
没有扭曲分歧,版本看起来像:
float v1;
float v2;
//calculate values of v1 and v2
v1 += v2*complicated_math();
//store v1
问题是,哪个版本更快?
换句话说,与一些额外的计算和添加0相比,warp禁用有多贵?
答案 0 :(得分:1)
你的问题没有一个答案。这在很大程度上取决于额外计算量,发散频率,硬件类型,尺寸和更多方面。最好的方法是简单地对两者进行编程并使用分析来确定在这种特定情况和情况下的最佳解决方案。