【问题标题】:Vulkan compute shader for parallel sum reduction用于并行求和减少的 Vulkan 计算着色器
【发布时间】:2021-07-30 06:43:35
【问题描述】:

我想实现这个算法 https://dournac.org/info/gpu_sum_reduction 在 Vulkan 的计算着色器中。在 OpenCL 中这很容易,因为我可以显式声明 哪些缓冲区是__local,哪些是__global。不幸的是,我似乎找不到 Vulkan 中的任何此类机制。请有经验的人给我举个例子,如何让这些东西在 Vulkan 中工作?

【问题讨论】:

    标签: gpgpu vulkan reduction compute-shader


    【解决方案1】:

    Vulkan 中的子组似乎具有相同的功能。这是一个着色器调用可以在子组中协作的功能。

    可能是这样的:

    void main(){
        int partial_sum = subgroupAdd(arr[gl_GlobalInvocationID.x]);
    
        if (subgroupElect()) {
            atomicAdd(mem, partial_sum);
        }
    }
    

    你可以学习Subgroup Tutorial

    然后,您可以尝试以“正常”方式进行操作,只需:

    void main(){
        int partial_sum = 0;
        for( int i = 0; i < LOCAL_SIZE; ++i ){
            partial_sum += arr[gl_WorkGroupID.x * gl_WorkGroupSize.x + i]
        }
    
        atomicAdd(mem, partial_sum); // or perhaps without atomics by recursively reducing
    }
    

    与其说是“平行”,不如说是不需要障碍。这只是衡量性能的问题,以找到最有效的方法,还可能取决于您假设输入数组有多大。

    免责声明:我没有尝试过着色器,因此假设它们是一种伪代码并且可能存在错误。

    也应该可以几乎逐字地实现您的链接算法。计算 GLSL 中 __local 的等价物是 shared。 GLSL 中的工作组障碍是memoryBarrierShared()

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 2021-01-30
      • 1970-01-01
      • 2016-12-27
      • 2021-09-10
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      相关资源
      最近更新 更多