这有点是one of my questions的延续。
但是这次我没有超出设备限制。所以我得到了一个充满了一些初始数据的存储缓冲区,并且我将它附加到在同一存储缓冲区中执行读取增量存储的着色器中。
void main() {
data[i] += data[i]
}
那么只要看一下这可以有任何同步问题吗?我没有看到它,每个PE都在使用自己的数据进行计算。
什么是有趣的,从输出它看起来像一个sin函数的值,从0开始然后从1然后0,缓冲区开头的值乘以它们自己几次,你进入缓冲区到达值中间值的中间值,然后我们达到的结束值越来越少。缓冲区中存在的所有值都是初始值的倍数
有人说,GPU通过将计算操作与内存访问重叠来隐藏内存延迟。但是,什么样的重叠正在摧毁我的所有数据呢?
还有一些注意到vkDispatch(x,y,z)
x
,y
,z
值有点作为乘数,如果我只在x
上发送我看到更少的容易出错的输出数据,仍然不会发生,对于大型数据集,我确实达到了极限该设备,所以我做什么? →我分别开始在y
,z
上发送,然后当我这样做时,我看到更多容易出错的结果。
如果您有N个项目,并且MaxX的最大发送宽度(x),您想要执行以下操作:
int x = N > MaxX ? MaxX : N;
int y = N / MaxX;
if (y * MaxX < N)
y++; // round up when N isn't an integer multiple of MaxX
vkCmdDispatch(cmdbuf, x, y, 1);
然后在你的着色器中:
int dispatch_x = gl_WorkGroupSize.x * gl_NumWorkGroups.x;
int i = (gl_GlobalInvocationID.y * dispatch_x) + gl_GlobalInvocationID.x;
// number of invocations might be greater than N either because
// N doesn't divide into the workgroup size evenly, or because N
// doesn't divide into dispatch_x evenly (or both).
if (i >= N) return;
data[i] += data[i];