金属计算像素依赖于其他像素颜色
Metal compute- pixels dependent on other pixels colour
我最近开始学习金属框架,所以我可以为我的 swift 应用程序编写一些过滤器。
我即将编写一个基于误差扩散抖动来抖动图片的金属内核。
每个像素都被赋予一个颜色,然后根据原始像素颜色将值分配给相邻像素。随着每个像素的计算,这些值分布在整个图像上,因此所有像素都相互依赖。
该示例将是 Floyd stein berg 抖动。
以金属处理线程的方式,这种抖动方法将不起作用。对图像进行抖动时,只能按从头到尾的顺序计算像素。
是否可以有一个不涉及线程的内核,或者 select 整个图像数组由单个线程计算的方法?
简而言之,不,您不能使用 GPU 计算来做到这一点,因为 GPU 方法是隐式并行的。这意味着一个结果不能依赖于所有其他结果。您可以尝试将计算分解为多个阶段,以便一次一个阶段可以并行完成。不过,这取决于您的计算逻辑。如果您只想在 GPU 上使用 "one thread",那么只在 CPU 上进行计算可能会更快。如果您有兴趣,我写了一个您可能想阅读的关于 Rice decompression with Metal 的方法。这种方法确实是逐块分割解压任务。
我最近开始学习金属框架,所以我可以为我的 swift 应用程序编写一些过滤器。 我即将编写一个基于误差扩散抖动来抖动图片的金属内核。 每个像素都被赋予一个颜色,然后根据原始像素颜色将值分配给相邻像素。随着每个像素的计算,这些值分布在整个图像上,因此所有像素都相互依赖。 该示例将是 Floyd stein berg 抖动。
以金属处理线程的方式,这种抖动方法将不起作用。对图像进行抖动时,只能按从头到尾的顺序计算像素。 是否可以有一个不涉及线程的内核,或者 select 整个图像数组由单个线程计算的方法?
简而言之,不,您不能使用 GPU 计算来做到这一点,因为 GPU 方法是隐式并行的。这意味着一个结果不能依赖于所有其他结果。您可以尝试将计算分解为多个阶段,以便一次一个阶段可以并行完成。不过,这取决于您的计算逻辑。如果您只想在 GPU 上使用 "one thread",那么只在 CPU 上进行计算可能会更快。如果您有兴趣,我写了一个您可能想阅读的关于 Rice decompression with Metal 的方法。这种方法确实是逐块分割解压任务。