点积与直接矢量分量的总和着色器的性能



我正在编写CG着色器,用于基于Unity的游戏的高级照明计算。有时需要对所有向量分量求和。有两种方法可以做到这一点:

  1. 只需写这样的东西: 浮点数和 = v.x + v.y + v.z;
  2. 或者执行以下操作: 浮点数和 = 点(v,浮点数3(1,1,1((;

我真的很好奇什么更快,代码风格看起来更好。

很明显,如果我们对 CPU 计算有同样的问题,第一种简单方法要好得多。以:

a( 无需分配另一个浮点数(1,1,1(向量

b( 没有必要将每个原始向量"v"分量乘以 1。

但是由于我们在 GPU 上运行的着色器代码中执行此操作,我相信对点积函数有一些很棒的硬件优化,并且可能会将 float3(1,1,1( 的分配转换为根本不分配。

float4 _someVector;
void surf (Input IN, inout SurfaceOutputStandard o){
float sum = _someVector.x + _someVector.y + _someVector.z + _someVector.w;
// VS
float sum2 = dot(_someVector, float4(1,1,1,1));
}

检查此链接。

Vec3 点的成本为 3 个周期,而标量加法的成本为 1。 因此,在几乎所有平台(AMD和NVIDIA(中:

float sum = v.x + v.y + v.z;的费用为 2float sum = dot(v,float3(1,1,1));的费用为 3

第一次实现应该更快。

点积在 cg 中的实现:https://developer.download.nvidia.com/cg/dot.html

恕我直言,在 98% 的情况下,差异是不可估量的,但第一个应该更快,因为乘法是一种"更昂贵"的操作

相关内容

  • 没有找到相关文章

最新更新