thread_position_in_grid是网格中的索引(整数),它采用您指定的范围中的值dispatchThreadgroups:threadsPerThreadgroup:.由您决定所需的线程组数以及每组的线程数.
在以下示例代码中,您可以看到threadsPerGroup.width * numThreadgroups.width == inputImage.width和threadsPerGroup.height * numThreadgroups.height == inputImage.height.在这种情况下,网格中的位置因此将是非标准化(整数)像素坐标.
Metal 中计算着色器的每次启动都伴随着一个密集的矩形 3D 线程 ID 网格。调用 时设置网格的尺寸[MTLComputeCommandEncoder dispatchThreadGroups:threadsPerThreadgroup:]。例如,您可以拥有一个{16,16,1}线程组大小(一个 16x16x1 正方形的线程组中的 256 个线程)和 的线程组计数{1,2,1},这将导致启动两个线程组,形状中的总面积为 512 个线程{16,32,1}。这些是出现在内核顶部的整数作为[[thread_position_in_grid]]. 线程位置是你告诉你是哪个线程的方式,就像传递给块的 threadID 参数一样dispatch_apply()。
Metal 指定没有映射 [[thread_position_in_grid]]到纹理中的坐标。这是由您在计算着色器中的软件中完成的。如果要读取图像中某个偏移处的纹理区域中的所有其他像素,则需要将 threadID 乘以 2 并在将新坐标传递给 之前在内核中添加偏移量texture2d.sample。由于 Metal 无法启动部分线程组,因此您需要确保不执行不需要的线程组。例如,当应用于较小的纹理时,32x64 启动的完整尺寸可能会导致您注销纹理的末尾。在这种情况下,您必须检查 threadID 以查看线程是否会在末尾注销,然后返回着色器或跳过该线程的纹理写入调用以避免出现问题。
| 归档时间: |
|
| 查看次数: |
1608 次 |
| 最近记录: |