我在 Open GL ES 中有一个着色器程序。我想调整本地/全局工作组大小以使用 Compute Shader 完成一维任务。
我有一个任务的总大小(可以在不同运行之间改变的线程总数),比如 [task_size]。假设我指定本地工作组大小,让它成为 [local_size]。而且我知道我有多少个工作组,比如说[工作组]。我在这里指定本地大小:
layout(local_size_x = [local_size]) in;
我在 glDispatchCompute 中指定了工作组的数量:
glDispatchCompute([workgroups], 1, 1);
如果local_size * workgroups == task_size
,我清楚地了解会发生什么。任务的每个部分由单独的组计算。
但是如果 task_size 不能被 local_size 整除会发生什么?我知道我需要的最少工作组数是task_size / local_size + 1
. 但它是如何工作的?最后一个工作组实际上比其他工作组少吗?会影响性能吗?让 task_size 能被 local_size 整除是个好主意吗?