这有点是one of my questions的延续。
但是这次我没有超出设备限制。所以我得到了一个充满了一些初始数据的存储缓冲区,并且我已将它附加到在同一存储缓冲区中执行读取增量存储的着色器。
void main() {
data[i] += data[i]
}
所以只要看一下就可以有任何同步问题吗?我没有看到它,每个PE都在使用自己的数据进行计算。
有趣的是,根据输出它看起来像 sin 函数的值,从 0 开始然后 1 然后 0 ,缓冲区开头的值会自己乘以几次,进入缓冲区的次数越多,达到值中间值多次乘以的中间值,然后我们到达终点价值越来越少。缓冲区中存在的所有值都是初始值的倍数
有人说GPU通过将计算操作与内存访问重叠来隐藏内存延迟。但是,什么样的重叠正在摧毁我的所有数据呢?
还有一些注意事项vkDispatch(x,y,z)
x
,y
,z
值有点作为乘数,如果我只在[{1}}上发送,我会看到更少的错误-prone-output-data,仍然不会发生,对于大型数据集,我确实达到了设备的极限,所以我做了什么? →我分别开始x
,y
,然后当我这样做时,我会看到更容易出错的结果。
答案 0 :(得分:0)
如果你有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];