问题标签 [metal-performance-shaders]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
148 浏览

ios - 在 Apple Metal 上的 MPSImageLanczosScale 之后应用着色器的问题

在应用MPSImageLanczosScale后在 MTLTexture 上应用着色器时,我得到了奇怪的结果。

即使变换为 scale = 1 和 translationX = 0 和 translationY = 0。

如果我不应用 MPSImageLanczosScale,它运行良好。您可以在下面看到不应用 MPSImageLanczosScale 和应用 MPSImageLanczosScale 的结果。

在此处输入图像描述

我的渲染方法如下所示:

不知道我做错了什么。有任何想法吗?

0 投票
0 回答
62 浏览

metal - 使用 Metal Performance Shaders 计算 SVD

我可以使用(组合)现有的金属性能着色器来计算矩形矩阵的 SVD 分解吗?我看到他们只有 QR 和 LU 分解。

0 投票
2 回答
238 浏览

metal - 从 GPU 上的矩阵乘法中受益的最小矩阵大小

我对使用金属性能着色器的矩阵乘法特别感兴趣,但是关于其他框架的答案也很好。

矩阵乘法在理论上是高度可并行化的操作。我需要将很多矩阵自己相乘,例如 A' A (撇号代表转置)。矩阵 A 的大小约为 4000 x 300。考虑到这些矩阵的大小,我想知道是否值得将乘法代码移植到 GPU。据我了解,在 GPU 上进行乘法还涉及将数据从主内存复制到 GPU 内存(我使用的是 eGPU,因此不共享内存)。然后必须在来回复制数据的额外工作和加快计算速度之间进行权衡。所以我的问题是:在矩阵的大小(大约)下,我可以开始看到在 GPU 上执行它的好处?

PS还有这篇文章基本上说不要打扰,因为GPU没有帮助,它的内存缓存很慢(通常在所有GPU上):https://graphics.stanford.edu/papers/gpumatrixmult/gpumatrixmult。 pdf

0 投票
1 回答
43 浏览

metal - 如何在 Metal Performance Shaders 中实现矩阵所有元素的标量运算?

假设我有一个矩阵,我想计算所有元素的 sin()。

我如何使用金属性能着色器做到这一点?

我是否编写了一些继承自的新内核MPSMatrixUnaryKernel

0 投票
0 回答
462 浏览

ios - iOS 14 上的 Metal 崩溃

自 iOS 14 推出以来,我在调用 metalDevice?.makeRenderPipelineState 时在下面的 Metal 代码中的以下行中遇到了崩溃。

我在 Firebase 控制台中看到了这个崩溃日志,并且无法重现。

有人能告诉我这里出了什么问题吗?崩溃日志是什么意思?

0 投票
0 回答
72 浏览

metal - 金属深度夹紧

我想禁用远点和近点之间的钳位。已经尝试修改采样器以禁用对边缘的钳位(constexpr sampler s(address::clamp_to_zero)并且它对边缘按预期工作,但大多数远点和近点之间的坐标仍在钳位。

当前不需要的结果: https ://gph.is/g/ZyWjkzW

预期结果: https ://i.imgur.com/GjvwgyU.png

也尝试过encoder.setDepthClipMode(.clip),但没有奏效。

部分代码:


0 投票
1 回答
113 浏览

arrays - 金属双指针

我正在尝试在数组数组上运行金属计算着色器。我认为因为我们使用指针来为着色器提供数组,所以逻辑解决方案是在处理 2D 数组时使用双指针。

我的核函数形式为:

当我device float** array2D [[buffer(0)]]在 Metal 着色器函数中用作参数时,出现错误:

缓冲区指针类型“设备浮点 *”的地址空间限定无效

我假设这是因为编译器将其解释device float *为地址空间限定(无效)。我的问题是:如何告诉编译器我正在使用双指针?如果由于某种原因我不能使用双指针,那么处理二维数组有什么好的解决方法?

旁注:我知道可以将所有数组中的元素组合成一个数组,对单个数组进行计算,然后将数组分成更小的数组。但是,这确实效率低下并且需要很长时间。(我正在使用大型阵列,因此使用金属)。

0 投票
1 回答
176 浏览

macos - 您应该如何在 Metal 中正确编码大量 blit 或缩放命令?

在我正在处理的使用传统 Metal 渲染循环的应用程序中,我需要定期将大量图像数据从IOSurfacesto复制到 to,MTLTextures以便可以在片段着色器中访问数据。我正在努力学习最有效的方法来做到这一点。

每个都IOSurface代表一个可能非常大的图像中的一个图块。(就像拼接的全景图。)Core Image 用于将图像数据渲染到每个IOSurface.

在 Metal中,如果图像“缩小”小于视图大小,我有一个包含足够切片来覆盖视口和/或图像本身的MTLTexture类型。2DArray

TheIOSurfaceMTLTextureeach 是二次方的维度,但有时它们可​​能是不同的维度。当它们的尺寸相同时,我使用 anMTLBlitCommandEncoder但当它们的尺寸不同时,我使用MPSImageScale

如果我需要将大量 IOSurface 复制到大量金属纹理,我应该一次一个、分批还是一次全部复制?

尝试#1:一次性

这种方法有效,但如果可见表面的数量变得非常大,就会开始崩溃。你最终会在提交之前预先分配一堆表面支持的纹理。这种方法对我来说似乎是最合乎逻辑的,但它也会在 Xcode 的 GPU 洞察中引起最多的警告,并在不需要时使用最多的纹理内存。

伪代码如下:

尝试2:分批

在这个实现中,我将复制复制命令任意分组为 10 个组。这意味着我只在提交缓冲区之前预先分配了多达 10 个表面支持的“sourceTextures”。这似乎使 GPU 更快乐一点,但 10 的值似乎相当随意。这里有一个可以根据硬件确定的最佳数字吗?

尝试3:一次一个

没有代码,但这个选项只是使用上面的批处理选项,但以 1 为一组。实际上,为需要复制到纹理的每个表面创建一个新的命令缓冲区和 blit 编码。最初这似乎非常浪费,但现在我意识到命令缓冲区和编码器非常轻量级。毕竟,无论如何,您都会在每个渲染通道上创建新的。

但是一次做一次是否没有充分利用 GPU?复制操作之间没有依赖关系。

TL;博士

如果您必须使用 发出大量blit复制命令或缩放命令MPS,那么最有效和“正确”的方法是什么?

目前,我正在针对 macOS 11.0 及更高版本进行构建。该应用程序应在任何受支持的硬件上运行。

0 投票
3 回答
299 浏览

ios - 使用 Metal 有效计算 UIImage/CIImage 中有多少透明像素

CIImage我们可以计算/中存在多少透明像素的最快方法是什么UIImage

例如:

在此处输入图像描述

如果我们谈论效率,我的第一个想法是使用Metal Kernelusing any CIColorKernelor so,但我不明白如何使用它来输出“count”。

还有我想到的其他想法:

  1. 使用某种平均颜色来计算它,“越红”越填充像素?也许某种线性计算取决于图像大小(使用CIAreaAverage CIFilter
  2. 一个一个地计算像素并检查RGB值?
  3. 使用 Metal 并行功能,类似于这篇文章:Counting coloured pixels on the GPU - Theory ?
  4. 缩小图像然后计数?或者上面建议的所有其他过程是否只是按比例缩放而不是版本,并且它的倍数取决于计算后的缩小比例?

实现此计数的最快方法是什么?

0 投票
1 回答
86 浏览

ios - 在 Swift 环境中切片类型的 MTLTexture - 2DArray

考虑具有一定数量切片MTLTexture的类型。2DArray要计算此纹理的特定切片的直方图,如何仅将单个纹理切片的引用传递给 MPSImageHistogram 着色器?

一般来说,如何在 swift 环境中切片纹理? Texture.makeTextureview()不是首选方式,因为它创建一个新的纹理会消耗更多的内存和时间。