问题标签 [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.
metal - 使用 Metal Performance Shaders 计算 SVD
我可以使用(组合)现有的金属性能着色器来计算矩形矩阵的 SVD 分解吗?我看到他们只有 QR 和 LU 分解。
metal - 从 GPU 上的矩阵乘法中受益的最小矩阵大小
我对使用金属性能着色器的矩阵乘法特别感兴趣,但是关于其他框架的答案也很好。
矩阵乘法在理论上是高度可并行化的操作。我需要将很多矩阵自己相乘,例如 A' A (撇号代表转置)。矩阵 A 的大小约为 4000 x 300。考虑到这些矩阵的大小,我想知道是否值得将乘法代码移植到 GPU。据我了解,在 GPU 上进行乘法还涉及将数据从主内存复制到 GPU 内存(我使用的是 eGPU,因此不共享内存)。然后必须在来回复制数据的额外工作和加快计算速度之间进行权衡。所以我的问题是:在矩阵的大小(大约)下,我可以开始看到在 GPU 上执行它的好处?
PS还有这篇文章基本上说不要打扰,因为GPU没有帮助,它的内存缓存很慢(通常在所有GPU上):https://graphics.stanford.edu/papers/gpumatrixmult/gpumatrixmult。 pdf
metal - 如何在 Metal Performance Shaders 中实现矩阵所有元素的标量运算?
假设我有一个矩阵,我想计算所有元素的 sin()。
我如何使用金属性能着色器做到这一点?
我是否编写了一些继承自的新内核MPSMatrixUnaryKernel
?
ios - iOS 14 上的 Metal 崩溃
自 iOS 14 推出以来,我在调用 metalDevice?.makeRenderPipelineState 时在下面的 Metal 代码中的以下行中遇到了崩溃。
我在 Firebase 控制台中看到了这个崩溃日志,并且无法重现。
有人能告诉我这里出了什么问题吗?崩溃日志是什么意思?
metal - 金属深度夹紧
我想禁用远点和近点之间的钳位。已经尝试修改采样器以禁用对边缘的钳位(constexpr sampler s(address::clamp_to_zero)
并且它对边缘按预期工作,但大多数远点和近点之间的坐标仍在钳位。
当前不需要的结果: https ://gph.is/g/ZyWjkzW
预期结果: https ://i.imgur.com/GjvwgyU.png
也尝试过encoder.setDepthClipMode(.clip)
,但没有奏效。
部分代码:
arrays - 金属双指针
我正在尝试在数组数组上运行金属计算着色器。我认为因为我们使用指针来为着色器提供数组,所以逻辑解决方案是在处理 2D 数组时使用双指针。
我的核函数形式为:
当我device float** array2D [[buffer(0)]]
在 Metal 着色器函数中用作参数时,出现错误:
缓冲区指针类型“设备浮点 *”的地址空间限定无效
我假设这是因为编译器将其解释device float *
为地址空间限定(无效)。我的问题是:如何告诉编译器我正在使用双指针?如果由于某种原因我不能使用双指针,那么处理二维数组有什么好的解决方法?
旁注:我知道可以将所有数组中的元素组合成一个数组,对单个数组进行计算,然后将数组分成更小的数组。但是,这确实效率低下并且需要很长时间。(我正在使用大型阵列,因此使用金属)。
macos - 您应该如何在 Metal 中正确编码大量 blit 或缩放命令?
在我正在处理的使用传统 Metal 渲染循环的应用程序中,我需要定期将大量图像数据从IOSurfaces
to复制到 to,MTLTextures
以便可以在片段着色器中访问数据。我正在努力学习最有效的方法来做到这一点。
每个都IOSurface
代表一个可能非常大的图像中的一个图块。(就像拼接的全景图。)Core Image 用于将图像数据渲染到每个IOSurface
.
在 Metal中,如果图像“缩小”小于视图大小,我有一个包含足够切片来覆盖视口和/或图像本身的MTLTexture
类型。2DArray
TheIOSurface
和MTLTexture
each 是二次方的维度,但有时它们可能是不同的维度。当它们的尺寸相同时,我使用 anMTLBlitCommandEncoder
但当它们的尺寸不同时,我使用MPSImageScale
。
如果我需要将大量 IOSurface 复制到大量金属纹理,我应该一次一个、分批还是一次全部复制?
尝试#1:一次性
这种方法有效,但如果可见表面的数量变得非常大,就会开始崩溃。你最终会在提交之前预先分配一堆表面支持的纹理。这种方法对我来说似乎是最合乎逻辑的,但它也会在 Xcode 的 GPU 洞察中引起最多的警告,并在不需要时使用最多的纹理内存。
伪代码如下:
尝试2:分批
在这个实现中,我将复制复制命令任意分组为 10 个组。这意味着我只在提交缓冲区之前预先分配了多达 10 个表面支持的“sourceTextures”。这似乎使 GPU 更快乐一点,但 10 的值似乎相当随意。这里有一个可以根据硬件确定的最佳数字吗?
尝试3:一次一个
没有代码,但这个选项只是使用上面的批处理选项,但以 1 为一组。实际上,为需要复制到纹理的每个表面创建一个新的命令缓冲区和 blit 编码。最初这似乎非常浪费,但现在我意识到命令缓冲区和编码器非常轻量级。毕竟,无论如何,您都会在每个渲染通道上创建新的。
但是一次做一次是否没有充分利用 GPU?复制操作之间没有依赖关系。
TL;博士
如果您必须使用 发出大量blit
复制命令或缩放命令MPS
,那么最有效和“正确”的方法是什么?
目前,我正在针对 macOS 11.0 及更高版本进行构建。该应用程序应在任何受支持的硬件上运行。
ios - 使用 Metal 有效计算 UIImage/CIImage 中有多少透明像素
CIImage
我们可以计算/中存在多少透明像素的最快方法是什么UIImage
?
例如:
如果我们谈论效率,我的第一个想法是使用Metal Kernel
using any CIColorKernel
or so,但我不明白如何使用它来输出“count”。
还有我想到的其他想法:
- 使用某种平均颜色来计算它,“越红”越填充像素?也许某种线性计算取决于图像大小(使用
CIAreaAverage
CIFilter
? - 一个一个地计算像素并检查
RGB
值? - 使用 Metal 并行功能,类似于这篇文章:Counting coloured pixels on the GPU - Theory ?
- 缩小图像然后计数?或者上面建议的所有其他过程是否只是按比例缩放而不是版本,并且它的倍数取决于计算后的缩小比例?
实现此计数的最快方法是什么?
ios - 在 Swift 环境中切片类型的 MTLTexture - 2DArray
考虑具有一定数量切片MTLTexture
的类型。2DArray
要计算此纹理的特定切片的直方图,如何仅将单个纹理切片的引用传递给 MPSImageHistogram 着色器?
一般来说,如何在 swift 环境中切片纹理? Texture.makeTextureview()
不是首选方式,因为它创建一个新的纹理会消耗更多的内存和时间。