对于这个问题,唯一的解决方法是使用SIMD16或SIMD8。以下是使用SIMD16的示例代码:
[numthreads(8, 8, 1)]
void main(uint3 DTid : SV_DispatchThreadID)
{
for (uint i = DTid.x; i < DispatchThreadID.x + 16; i += 16)
{
float4 v = Input[i];
//process v
Output[i] = v;
}
}
在使用SIMD16时,将通过每16个线程一组的方式使用更多的线程来执行更多的操作。这通常会导致更高的效率,因为每个线程工作量相对较少。要使用SIMD8,同样的代码可以简单地修改为:
[numthreads(8, 8, 1)]
void main(uint3 DTid : SV_DispatchThreadID)
{
for (uint i = DTid.x; i < DispatchThreadID.x + 8; i += 8)
{
float4 v = Input[i];
//process v
Output[i] = v;
}
}
无论是使用SIMD16还是SIMD8,都可以显著提高着色器的效率,从而解决着色器编译器在Alderlake GT1上的效率低下问题。