我使用计算着色器做一些事情。我创建一个特定长度的输入缓冲区(1维)然后调用x和y上的调度以优化计算时间。但是我访问索引时遇到了问题。可能是什么问题?
double size = Math.Ceiling(Math.Sqrt(input.pattern.Length));
shader.Start((int)Math.Ceiling(size/32), (int)Math.Ceiling(size / 32), 1);
在hlsl代码中......
[numthreads(32, 32, 1)]
void Reconstruction(uint3 dispatchThreadID : SV_DispatchThreadID)
{
int idx = dispatchThreadID.y * size + dispatchThreadID.x;
if (idx > rayCount) { return; }
我打印了idx,但有些是重复的,我不明白为什么......
答案 0 :(得分:1)
线程分组中的维度数用作方便而不是优化。在引擎盖下,它们将会大致相同。因此,对于1D缓冲区,使用
之类的东西并不会更糟糕for(var k=j+1; k<sorted.length; k++) {
比你上面的。您还可以获得额外的好处,即最终在着色器中执行较少的计算,因为您将自动获取通过[numthreads(64, 1, 1)]
void Reconstruction(uint3 dispatchThreadID : SV_DispatchThreadID)
{
int idx = dispatchThreadID.x;
// ... etc ...
}
参数传入的正确索引。
您应该记住的唯一优化是,组中线程的总数理想情况下应该是64的倍数。这是因为在硬件级别,AMD GPU通常使用64个线程的“波形”一时间NVidia(如果我没记错的话)32,仍然有效。如果你使用(比方说)32那么你就可以获得50%的AMD利用率,这并不酷。