【问题标题】:Vulkan compute shader for parallel sum reduction用于并行求和减少的 Vulkan 计算着色器
【发布时间】:2021-07-30 06:43:35
【问题描述】:
【问题讨论】:
标签:
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()。