HLSL num threads and dispatch (Vulkan),如何高效调度?

问题描述 投票:0回答:0

我正在使用 HLSL 在 VUlkan 中编写粒子模拟,在 Linux 上使用 DXC 编译成 spirv。

我意识到我对

numthreads
的工作原理有一个误解。

让我分享一个小片段:

[numthreads(100, 1, 1)]
void main(uint3 id : SV_DispatchThreadID)
{
    uint index = id.x;

    simulate_particle(index);
    transfer_velocity_to_grid(min(index, 100));
}

当我这样做时,我似乎获得了 100 多个线程,因此我的索引超出了请求的范围。另一方面,这很好:

[numthreads(1, 1, 1)]
void main(uint3 id : SV_DispatchThreadID)
{
    uint index = id.x;

    simulate_particle(index);
    transfer_velocity_to_grid(min(index, 100));
}

即上面产生了 100 个线程。在两个版本的 CPU 端,我请求每个维度有 (100, 1, 1) 个工作线程的向量。所以在第一个版本中我所做的似乎是调用 100*100 个线程而不是仅仅 100 个。

当然,对于有效的版本,我没有充分利用 CPU。

我可以在着色器中声明数量为 (100, 1, 1) 的线程,并且只分派 (1, 1, 1) 个工作组。但这有一个问题,如果在运行时调度量发生变化,我无法更新它。

如果要发送的金额始终是

numthreads
的倍数,那么我可以发送
total_dispatches / numthreads

但是如果我需要的工作组数量不是这样的倍数,我不知道如何高效地调度我的工作组。我会发送比我实际需要的更多或更少的组,在这两种情况下我都会遇到错误。

有没有一种方法可以准确地将动态数量的工作发送到计算着色器,准确生成那么多线程并有效地使用 GPU 来执行它们?

multithreading graphics vulkan hlsl compute-shader
© www.soinside.com 2019 - 2024. All rights reserved.