关于C++ AMP Remappable Shader

这个博客文章描述了C++ +可恢复的着色器特性及其在VisualStudio 2014中编译/执行模型的变化。这个特性提高了C++ AMP代码编译速度,而不影响运行时性能。我们将提供数据来显示改进,并介绍使用此功能的步骤。

null

为了理解remappable shader的优势,我将从它所替代的技术开始。以前,对于C++中的大多数并行调用,Visual C++编译器生成了两个DirectX着色器(对于每个并行的FoRX调用),最终通过DirectX层将其转换成设备代码,微软的C++实现被建立。由于潜在的资源混叠(例如,不同的数组视图对象引用重叠的内存位置),每个的并行产生两个着色器的事实是性能和程序正确性之间的折衷。例如,在下面的代码段中,编译器无法证明a0、a1、a2和a3引用了不重叠的数据,因为这些信息仅在运行时可用。

void foo(数组视图&a0、数组视图&a1、数组视图&a2、数组视图&a3)

{

每个并行u(a0.extent,[&](index<1>const idx)限制(amp)

{

a0[idx]=10;

a1[idx]=15;

a2[idx]=a0[idx];

a3[idx]=a1[idx];

a0[idx]+=a1[idx];

a1[idx]=a2[idx];

a2[idx]*=a3[idx];

if(a0[idx]){a3[idx]/=a0[idx];}

});

}

因此,编译器必须假设代码生成中最差的混叠模式以保证程序的正确性,从而产生我们所称的混叠着色器。另一方面,性能是一个关键因素,这就是为什么我们还生成了一个非锯齿明暗器,顾名思义,假设没有 捕获到的资源之间存在别名,具有更好的性能特征。C++ AMP运行时根据每个具体的并行对象FoLi调用的别名模式,选择最佳的运行时间。

使用remappable着色器特性,我们只在编译期间生成非别名版本。运行时现在负责确保正确处理不同的资源别名模式。因此,它包括第二阶段着色器编译,以便为每个特定的混叠模式生成最佳代码。最后的着色器代码也由运行时缓存,以便下次使用相同模式调用时不再需要编译。我们的测量结果表明,额外的运行时编译对性能的影响可以忽略不计,而生成一个较少的着色器将着色器编译时间减少一半。

具体如何将其转换为可见的编译加速取决于每个内核(包括整个调用图)的并行u的复杂性。对于一些有趣的测试样本,我们观察到了从8%到28%的加速,总结如下。

编译加速

卡通机

8%%

流体模拟

14%%

序列比对

28%%

在这些示例中,编译加速表示端到端的用户体验。为了享受Realppabl着色器的好处,您需要用实现该特性的VisualC++编译器编译代码。由于运行时着色器编译,C++ AMP依赖于D3DCOMPILRIL47.DLL,它作为Windows 8.1和更高的系统组件存在。对于低级OSES,需要C++开发人员来传输D3DCOMPILRIL47.DLL。请参阅 DirectX开发包 更多说明。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享