标签: metal

在iPhone上处理GPU(金属)和CPU(OpenCV)上的摄像头输入数据

我在iOS上以120 fps进行实时视频处理,并希望首先在GPU上预处理图像(下采样,转换颜色等在CPU上不够快),然后使用OpenCV在CPU上后处理帧.

使用Metal在GPU和CPU之间共享摄像头馈送的最快方法是什么?

换句话说,管道看起来像:

CMSampleBufferRef -> MTLTexture or MTLBuffer -> OpenCV Mat
Run Code Online (Sandbox Code Playgroud)

我正在通过以下方式转换CMSampleBufferRef - > MTLTexture

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

// textureRGBA
{
    size_t width = CVPixelBufferGetWidth(pixelBuffer);
    size_t height = CVPixelBufferGetHeight(pixelBuffer);
    MTLPixelFormat pixelFormat = MTLPixelFormatBGRA8Unorm;

    CVMetalTextureRef texture = NULL;
    CVReturn status = CVMetalTextureCacheCreateTextureFromImage(NULL, _textureCache, pixelBuffer, NULL, pixelFormat, width, height, 0, &texture);
    if(status == kCVReturnSuccess) {
        textureBGRA = CVMetalTextureGetTexture(texture);
        CFRelease(texture);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的金属着色器完成后,我将MTLTexture转换为OpenCV

cv::Mat image;
...
CGSize imageSize = CGSizeMake(drawable.texture.width, drawable.texture.height);
int imageByteCount = int(imageSize.width * imageSize.height * 4);
int mbytesPerRow …
Run Code Online (Sandbox Code Playgroud)

opencv gpgpu objective-c ios metal

16
推荐指数
1
解决办法
4362
查看次数

Xcode 日志记录:“启用金属 API 验证”

我正在通过 Xcode 构建一个 macOS 应用程序。每次构建时,我都会得到日志输出:

启用金属 API 验证

据我所知,我的应用程序没有使用任何 Metal 功能。我没有使用硬件加速的 3D 图形或着色器或视频游戏功能或类似的东西。

为什么Xcode打印Metal API日志输出?

我的应用程序中是否使用了 Metal?我可以还是应该禁用它?

如何禁用此“启用金属 API 验证”日志消息?

macos xcode ios metal oslog

16
推荐指数
2
解决办法
1万
查看次数

如何将 PyTorch 模型转移到 Apple M1 芯片上的 GPU?

2022 年 5 月 18 日,PyTorch宣布支持Mac 上的 GPU 加速 PyTorch 训练。

我按照以下过程在我的 Macbook Air M1 上设置 PyTorch(使用 miniconda)。

conda create -n torch-nightly python=3.8 

$ conda activate torch-nightly

$ pip install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu
Run Code Online (Sandbox Code Playgroud)

我正在尝试执行此处提供的 Udacity 深度学习课程中的脚本。

该脚本使用以下代码将模型移动到 GPU:

conda create -n torch-nightly python=3.8 

$ conda activate torch-nightly

$ pip install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu
Run Code Online (Sandbox Code Playgroud)

然而,这不适用于 M1 芯片,因为没有 CUDA。

如果我们想将模型迁移到 M1 GPU,将张量迁移到 M1 GPU,并完全在 M1 GPU 上进行训练,我们应该做什么?


如果相关:GD是 GAN …

metal pytorch apple-m1

13
推荐指数
1
解决办法
3万
查看次数

编译并运行金属示例

我使用XCode已经有一段时间了,但是由于Apple推出了XCode 6和新的Metal API,我不得不检查它.

他们已经发布了一些示例,例如他们的Basic3D示例的转换版本.但是,我在编译和运行时遇到问题.我不得不添加Quatz和Metal框架的路径以进行编译和链接工作 - 我认为这应该是开箱即用的内置库吗?

金属着色器编译步骤也失败了,它找不到金属编译器.XCode中的路径设置在哪里?

如果我忽略着色器编译步骤,我会收到一个错误,即应用程序无法在任何模拟器上运行.基于金属的3D应用程序只能在实际硬件上运行而不能在模拟器模式下运行吗?

ios xcode6 metal

12
推荐指数
2
解决办法
7173
查看次数

iOS代码在运行时识别金属支持?

通常,我使用以下代码来识别设备的iOS版本.

if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
Run Code Online (Sandbox Code Playgroud)

以类似的方式,我试图找到设备的金属支持.使用A7(或更好)GPU和iOS 8.0的Apple设备支持Metal.

这是我希望我的代码工作的方式:

if (MetalSupported == true) {
  // metal programming
} else {
  // opengles2 programming
}
Run Code Online (Sandbox Code Playgroud)

如何获取布尔变量的值MetalSupported

objective-c ios metal

12
推荐指数
2
解决办法
3187
查看次数

构建iOS模拟器目标时忽略.metal文件

每当我构建一个包含金属着色器到x86_64目标(iOS模拟器)的项目时,我都会得到一个依赖性分析警告:

warning: no rule to process file '[File Path]/Shaders.metal' of type sourcecode.metal for architecture x86_64

我知道这不是一个大问题,但我喜欢在构建时保持我的项目不受警告,因此当出现真正的问题时,我实际上会注意到黄色警告三角形.

任何快速的方法让Xcode忽略模拟器目标的金属文件?

xcode ios ios-simulator metal metalkit

12
推荐指数
1
解决办法
591
查看次数

iOS Metal计算管道比搜索任务的CPU实现慢

我做了一个简单的实验,通过实现naive char搜索算法,在CPU和GPU上使用iOS8 Metal计算管道搜索每行50个字符(50 mil字符映射)的1.000.000行.

CPU实现使用简单的循环,Metal实现给每个内核1行进行处理(下面的源代码).

令我惊讶的是,Metal实现平均比简单的线性CPU(如果我使用1个核心)慢2-3倍,如果我使用2个核心(每个都搜索一半数据库),则慢3-4倍!我尝试了每组不同的线程(16,32,64,128,512)但仍然得到非常相似的结果.

iPhone 6:

CPU 1 core:  approx 0.12 sec
CPU 2 cores: approx 0.075 sec
GPU: approx 0.35 sec (relEase mode, validation disabled)
Run Code Online (Sandbox Code Playgroud)

我可以看到Metal shader花费超过90%的访问内存(见下文).

可以做些什么来优化它?

任何见解都将受到赞赏,因为互联网上没有太多来源(除了标准的Apple编程指南),提供有关内存访问内部的详细信息以及特定于Metal框架的权衡.

金属实施细节:

主机代码要点:https: //gist.github.com/lukaszmargielewski/0a3b16d4661dd7d7e00d

内核(着色器)代码:https: //gist.github.com/lukaszmargielewski/6b64d06d2d106d110126

GPU帧捕获分析结果:

在此输入图像描述

performance shader ios metal

11
推荐指数
1
解决办法
2026
查看次数

newComputePipelineStateWithFunction失败

我试图让一个神经网络在金属上运行.基本思想是数据重复.每个gpu线程为随机数据点运行一个网络版本.

我写过其他着色器工作正常.

我还在c ++命令行应用程序中尝试了我的代码.没有错误.也没有编译错误.

我使用apple文档转换为metal c ++,因为不支持c ++ 11中的所有内容.

它在加载内核函数后以及在尝试分配newComputePipelineStateWithFunction给金属设备时崩溃.这意味着在编译时未捕获的代码存在问题.

MCVE:

kernel void net(const device float *inputsVector [[ buffer(0) ]], // layout of net *
                uint id [[ thread_position_in_grid ]]) {

    uint floatSize = sizeof(tempFloat);
    uint inputsVectorSize = sizeof(inputsVector) / floatSize;

    float newArray[inputsVectorSize];


    float test = inputsVector[id];

    newArray[id] = test;

}
Run Code Online (Sandbox Code Playgroud)

更新

它与动态数组有关.

由于它无法创建管道状态并且不会崩溃运行实际着色器,因此它必须是编码问题.不是输入问题.

将动态数组中的值分配给缓冲区会使其失败.

c++ metal

11
推荐指数
1
解决办法
614
查看次数

使用纯Metal-API以及SceneKit或SpriteKit

我在一个应用程序中运行了一个SKView和一个MTKView,到目前为止一切运行良好.

唯一的问题是,这两种观点在视觉上都很差.他们只是并排.但我想让SKView内部的纯金属渲染与内部的一些SKNode一起移动.它是SKView内部的一种快速显示.

在金属方面运行了相当多的计算和渲染的东西.SKView应该为重型计算提供了一个很好的用户界面,并且为纯金属部件提供了极小但非常快速的渲染.

我已经考虑过将SceneKit与SpriteKit场景叠加使用,因为SCNRenderer提供了使用renderAtTime渲染自己的MTLCommandBuffer和MTLRenderPassDescriptor的可能性.

我实现了以下SCNSceneRendererDelegate方法并调用了我自己的render函数,它正在准备commandBuffer.

func renderer(renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: NSTimeInterval) {
    nodeArray.render()
}
Run Code Online (Sandbox Code Playgroud)

在commandBuffer准备好之后,我调用了我的SCNRenderer的renderAtTime方法.试验和错误向我显示命令缓冲区必须在调用renderAtTime后提交.如果我在它崩溃应用之前这样做.如果我不这样做,它将冻结应用程序.

func bufferFinished(renderer:SCNRenderer, commandBuffer: MTLCommandBuffer, renderPassDescriptor: MTLRenderPassDescriptor){
    let current=CFAbsoluteTimeGetCurrent()
    renderer.renderAtTime(current, viewport: gameView.bounds, commandBuffer: commandBuffer, passDescriptor: renderPassDescriptor)
    commandBuffer.commit()
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,应用程序正在运行,但没有显示其他金属上下文.我认为因为金属部分所以整个事情都很复杂.

是否有任何简单的示例,其中纯金属在SceneKit视图中呈现或更好地在SpriteKit视图中呈现?

scenekit sprite-kit swift metal

11
推荐指数
1
解决办法
2231
查看次数

用金属屏幕撕裂和相机捕捉

为避免同时从gpu和cpu写入常量缓冲区,Apple建议在信号量的帮助下使用三缓冲系统,以防止cpu超出gpu(这很好并且覆盖在现阶段至少有三个金属视频).

但是,当常量资源是MTLTexture并且AVCaptureVideoDataOutput委托与渲染循环(CADisplaylink)分开运行时,类似的三重缓冲系统(如Apple的示例代码MetalVideoCapture中所使用的)如何保证同步?如果您使用MetalVideoCapture代码并简单地渲染全屏四边形并将预设更改为AVCaptureSessionPresetHigh(此时撕裂被旋转四边形和低质量预设遮挡),则可以观察到屏幕撕裂(纹理撕裂).

我意识到渲染循环和captureOutput委托方法(在这种情况下)都在主线程上,并且信号量(在渲染循环中)保持_constantDataBufferIndex整数被检查(其中索引到MTLTexture进行创建和编码),但仍然可以观察到屏幕撕裂,这对我来说很困惑(如果纹理的gpu写入不是编码后的下一帧但是后面有2或3帧,那将是有意义的,但我不相信这是这种情况).此外,只是一个小问题:渲染循环和captureOutput对于缓冲纹理系统不应具有相同的帧速率,因此旧帧不会与最近的帧交错.

任何有关此事的想法或澄清将不胜感激; 还有另一个来自McZonk的例子,它不使用三重缓冲系统,但我也观察到用这种方法撕裂(但不那么).显然,如果我使用waitUntilCompleted(相当于Open GL的glfinish),没有观察到撕裂,但这就像用一只手臂绑在背后的手风琴一样!

video opengl-es objective-c ios metal

11
推荐指数
1
解决办法
685
查看次数