问题标签 [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 投票
1 回答
974 浏览

ios - 金属 RGB 到 YUV 转换计算着色器

我正在尝试编写一个用于从 RGB 转换为 YUV 的金属计算着色器,但出现构建错误。

最后一行,即写入 textureCbCr 会引发错误:

在此处输入图像描述 我究竟做错了什么?

0 投票
2 回答
310 浏览

ios - MTKView currentRenderPassDescriptor 清除颜色

我正在使用 MTKView 绘图

如果可以设置此渲染通道描述符的 loadAction 和清除颜色,我不会这样做。默认透明色是否设置为黑色?

0 投票
1 回答
166 浏览

ios - MPSImageHistogramEqualization 抛出偏移量必须小于 [缓冲区长度] 的断言

我正在尝试在 iOS 上使用 MPSImageHistogramEqualization 进行直方图均衡化,但它最终抛出了一个我不理解的断言。这是我的代码:

这是发生在最后一行的结果断言:

关于这里可能发生的事情有什么建议吗?

0 投票
0 回答
1444 浏览

ios - CoreML / MLModelConfig 首选MetalDevice - 了解设备放置启发式

TL/DR:

在 macOS 上运行推理模型时,是否有任何公开文件明确说明CoreML'sGPU 设备放置策略?它如何决定它应该在集成、离散还是 CPU 上运行?可以可靠地“强制”一条路径吗?对于具有多个独立 GPU 和多个 eGPU 的新 Mac Pro 等系统,这种情况有何变化?

我对我的 rMBP 的测试表明答案是否定的——温度、电池、插入电源、自动图形设置和应用程序支持,甚至可能一些 MLModel 架构启发式都在设备放置中发挥作用。

我想要一些答案!

更长的上下文:

我很好奇是否有任何关于 CoreML 的设备选择启发式的公共文档。随着 10.15 的 CoreML preferredMetalDeviceAPI 的添加MLModelConfig,我想可以强制MTLDevice运行MLModel/ Vision 请求。

在我使用 Vega 20 在我的 2018 rMBP 上使用集成、离散和 eGPU 进行的测试中,似乎只有 eGPU 在请求时始终运行 CoreML 模型。

我的 CoreML 模型是一个管道模型,由具有多个输出的 MobileNet 分类器(附加到自定义特征提取器的多头分类器)组成。

出于以下几个原因,我很想了解设备选择偏好:

a) 我想确保将运行由本地支持的设备推理的MLModel图像,以限制 PCI 传输并继续在单个 GPU 设备上进行处理CIImagesMTLTextures

b) 我的模型实际上是输入视频帧,WWDC '19 / 10.15 引入了 VideoToolbox 和 AVFoundation API,以帮助强制特定 GPU 上的特定视频编码器和解码器。

从理论上讲,如果一切正常,我应该能够MTLDevice为视频解码、预处理、CoreML/Vision 推理和后续编码指定相同的内容——让所有IOSurface支持CVPixelBuffersCVMetalTextureRefs、、MPSImages和朋友驻留在同一个 GPU 上。

Apple 有一个 Pro Apps WWDC 视频,表明这是通往多 GPU 支持/Afterburner 解码器支持的快速路径的前进之路。

CoreML 实际上是否允许建议的设备放置工作?

我正在运行配备 Vega 20 GPU 的 Retina MacBook Pro 2018,并尝试各种方法让 Vega 20 点亮。

  • 禁用自动图形切换
  • 禁用自动图形切换/将 NSSupportsAutomaticGraphicsSwitching 设置为 False
  • 禁用自动图形切换/将 NSSupportsAutomaticGraphicsSwitching 设置为 True
  • 启用自动图形切换/将 NSSupportsAutomaticGraphicsSwitching 设置为 False
  • 启用自动图形切换/将 NSSupportsAutomaticGraphicsSwitching 设置为 True

  • 电池充满并插入我的 Apple 电源适配器

  • 充满电池并插入我的 eGPU

结果:

  • 如果我每次都MLModel使用MLModelConfigwith - ,我可以可靠地让 eGPU 运行推理。preferredMetalDevice

  • 如果我要求,我可以相当可靠地让集成 GPU 运行推理 - 但有时在某些电池电源配置、插入电源或自动图形切换选项的情况下,它不会运行。

  • 我无法可靠地让离散 GPU 在上述任何配置组合上始终如一地运行 - 但确实看到我的所有资源都驻留在 GPU(纹理等)上,并且看到 CoreML 被配置为在那里运行。它只是不报告任何活动。

我已将我的 info.plist 配置为具有适当的 eGPU 支持,并且可以热插拔/检测设备更改并将工作分配给 eGPU,并且还支持检测设备移除请求。这一切都有效。CoreML 不尊重我的设备放置!

任何见解都是最有帮助的。

提前致谢。

0 投票
1 回答
237 浏览

objective-c - 如何在 CIImageProcessorKernel 子类中为 Metal Compute 指定设备?

我有一个自定义的CIFilter,使用CIImageProcessorKernel. 内核本身非常简单:

这很好用,因为它产生了预期的结果。我遇到的问题是它在带有两个 GPU 的 MacBook Pro 上使用集成 GPU,我希望它使用离散 GPU。如果我将MTLCreateSystemDefaultDevice()(离散 GPU)的结果传递给-[MPSImageAreaMin initWithDevice:...],则会出现断言失败:

-[MTLDebugComputeCommandEncoder setComputePipelineState:] 断言失败 computePipelineState 与不同的设备相关联

这大概是因为MTLComputeCommandEncoder负责运行的机器内部使用的实例-encodeToCommandBuffer:sourceTexture:destinationTexture:已经设置为使用集成 GPU。我认为这来自于从物体中commandBuffer拉出。CIImageProcessorOutput

我的问题:是否可以指定要使用的 GPU -encodeToCommandBuffer:sourceTexture:destinationTexture:?大概这涉及自定义输出/金属命令缓冲区,但我不确定。

0 投票
1 回答
148 浏览

ios - MPSMatrixVectorMultiplication 太慢了

我正在研究进行大量数学计算的 GPU 算法,主要与矩阵和向量有关。虽然我在处理时间方面有很好的数字,但我仍然觉得还有改进的空间。

所以我为自己发现了Metal Performance Shaders框架。该框架的描述让我兴奋不已,因为我可以为我的 GPU 算法所做的数学运算找到经过微调和优化的内核着色器。

我决定首先使用MPSMatrixVectorMultiplication,因为我有一个很大的11000x500矩阵乘以向量11000 vector的输出500

所以这就是我使用它的方式。为s 和操作本身声明MPS包装器:MTLBuffer

初始化那些MPS包装器:

并做乘法:

0.8-1.1现在,我编写的核函数在ms左右执行完全相同的乘法运算。我很伤心地发现它MPSMatrixVectorMultiplication做到了18-19 ms

那太慢了,我不敢相信这样的结果。很明显,我遗漏了一些小细节,这些细节窃取了很多性能。

有没有人MPS在性能敏感的代码中使用过解决方案?我很高兴听到一些可以在我的 GPU 例程中应用的技巧。

提前致谢!

0 投票
0 回答
68 浏览

ios - 寻找使用金属着色器在大约 6-7 毫秒内解码全高清 JPEG 图像的解决方案

我有一个1080p图像,编码为JPEG. 我想加载到MTLTexture,但使用MTKTextureLoader它大约需要~60 ms

我需要一个解决方案来在6-7 ms内对其进行解码。是的,它需要在渲染时达到 30 FPSMetalView

我已经尝试过 GPU 支持的图像格式,但它会生成巨大的未压缩文件,这对我来说是不可接受的。

0 投票
1 回答
35 浏览

ios - 当图像较小时,MPSImageIntegral 返回全零

我有一个金属着色器,它处理 iPad Pro 视频帧以在颜色附件中生成(未显示的)RGBA32Float 图像。然后将该纹理通过 MPSImageIntegral 过滤器,编码到与着色器相同的命令缓冲区中,从而产生相同大小和格式的输出图像。在命令缓冲区的完成处理程序中,我使用以下代码读出过滤图像中的最后一个像素(包含输入图像中所有像素的总和):

只要保存输入和过滤图像的纹理都与 iPad 的显示器尺寸相同,即 2048 x 2732,它就可以正常工作,尽管对于如此大的图像来说速度很慢。

为了加快速度,我让着色器只生成一个 ¼ 大小 (512 x 683) RGBA32Float 图像,并使用相同的大小和格式作为过滤器的输出。但在那种情况下,我读出的总和总是零。

通过在调试器中捕获 GPU 帧,我可以看到依赖关系图在两种情况下看起来是一样的(除了后一种情况下减小的纹理大小),并且着色器和过滤器在两种情况下都按预期工作,基于输入和过滤纹理的外观,如调试器中所示。 那么为什么我不能再成功地读出过滤后的数据,而唯一的变化是减小过滤器的输入和输出图像的大小呢?

有些事情我已经尝试过,但无济于事:

  1. 使用 512 x 512(和其他尺寸)图像,以避免 512 x 683 图像中可能出现的填充伪影。
  2. 查看输出图像中间附近的其他像素,根据 GPU 快照,这些像素也包含非零数据,但在使用较小的图像时读取为 0。
  3. 在同一命令缓冲区中使用 MTLBlitCommandEncoder 将输出像素复制到 MTLBuffer 中,而不是使用 getBytes,或者除了使用 getBytes 之外。(这是这个 MacOS question的答案所建议的,它并不直接适用于 iOS。)
0 投票
2 回答
354 浏览

metal - 如何使用 Metal Shader Lanuage 计算具有 16 个通道的图像的均值和方差值

如何使用 Metal 计算具有 16 个通道的图像的均值和方差值?

我想分别计算不同通道的均值和方差值!

前任。:

0 投票
1 回答
203 浏览

ios - 使用 Metal Performance Shaders 生成随机数据

我正在尝试使用 MPSMatrixRandom 为我的应用程序生成一些随机整数数据,我有两个问题。

  1. MPSMatrixRandomMTGP32 和 MPSMatrixRandomPhilox 有什么区别?

    我知道这两个着色器使用不同的算法,但是它们之间有什么区别?这两种算法的性能或输出是否不同,如果有,有何不同?

  2. 您可以使用什么代码来实现这些着色器?

    我尝试自己实现它们,但我的应用程序总是崩溃并出现模糊的错误消息。我希望看到一个正确完成的示例实现。