【问题标题】:Best Practice for testing Managed Buffers?测试托管缓冲区的最佳实践?
【发布时间】:2021-12-16 12:35:37
【问题描述】:

在配备独立显卡的 Mac 上,应使用托管缓冲区而不是共享缓冲区,但使用 [MTLBuffer:didModifyRange:] 保持同步还有其他要求。

但是在 Apple Silicon 上,如果我通过假装 [MTLDevice hasUnifiedMemory] 返回 NO 并删除对 didModifyRange: 的调用来强制使用托管缓冲区,那么渲染工作正常。

在统一 GPU 内存的 Apple Silicon 上测试托管缓冲区的最佳方法是什么,以便我可以确定我的代码可以在较旧的 Mac 上运行?

【问题讨论】:

  • 确实可以,但基本上相当于使用共享存储模式
  • 是的,看起来我可以强制它创建托管缓冲区,但是没有验证对 [MTLBuffer:didModifyRange:] 的调用(或缺少),这很遗憾......
  • 您希望它如何工作? API 怎么知道您实际上写入了内存的那部分?有一些方法可以跟踪哪些页面被写入,例如使用mprotect,但它具有虚拟内存页面的粒度,并且还有许多其他注意事项。
  • @JustSomeGuy 我希望如果我忘记调用didModifyRange:,那么 GPU 缓冲区将不会同步。然而事实并非如此。如果我强制使用托管缓冲区,然后删除对我的 setDirty() 方法的调用,则渲染在 M1 Mac 上工作得很好。
  • 啊,你是这个意思。是的,我认为这是不可能的,因为在 Apple Silicon 上共享和管理实际上是相同的。我想说didModifyRange: 可能是 M1 的无操作。

标签: xcode macos testing metal apple-m1


【解决方案1】:

测试硬件兼容性的最佳做法是在您测试兼容性的实际硬件上。如果您计划支持与 Apple Silicon显着不同的离散 GPU,最好使用一个进行测试。

您可能会近似行为,但请记住,这只是一种模拟,无法确保实际硬件能够以相同的方式工作。

这类似于仅使用模拟器进行开发,这根本不是一个好习惯。

更新:有许多服务可以租用裸机 Mac。 MacInCloud 服务允许您使用外部 GPU(例如 AMD RX 580)配置机器。前 24 小时只需 0.99 美元。

那里有许多类似的服务,但这是我能够验证离散 GPU 是一种选择的第一个服务。

【讨论】:

  • 虽然我知道这不是一个非常令人满意的答案,但我相信这是正确的答案。
  • 感谢您的回答 - 很遗憾 Apple 不为此提供工具支持。对于许多开发人员来说,保留额外的硬件来测试这一点是不可行的。
  • Apple 曾经拥有他们所谓的硬件兼容性实验室——但据我所知,该程序已不复存在。但是,有些服务会在云端租用带有独立 GPU 的裸机 Mac。请查看我的答案的更新。
【解决方案2】:

根据我的经验,在渲染 api 时没有测试代码的最佳实践,因为这里有很多不同的因素: GPUCPU 供应商(AppleAMDIntel)、操作系统、司机。

我同意 Jeshua

测试硬件兼容性的最佳实践是在实际 您正在测试兼容性的硬件。

有许多有用的方法可以使开发和测试更容易:


您可以检测vendors id

id<MTLDevice> device = MTLCreateSystemDefaultDevice();
NSString* appleGPU = [device.name containsString:@"Apple"];
NSString* intelGPU = [device.name containsString:@"Intel"];
NSString* amdGPU = [device.name containsString:@"AMD"];
NSString* nvidiaGPU = [device.name containsString:@"Nvidia"];

使用following method,您可以找到您的gpu 类型

bool externalGPU = [device isRemovable] == true;
bool integratedGPU = [device isLowPower] == true;
bool discreteGPU = [device isLowPower] == false;

注意:

[device isLowPower];

在配备 Apple 硅 M1 芯片的 Mac 上,该属性为 NO,因为 GPU 以高性能和低功耗运行。


确定TBDR GPU 架构:

if (@available(macOS 10.15, *)) {
    if ([device supportsFamily: MTLGPUFamilyApple4])
    {
        // The GPU does support Tile-Based Deferred Rendering technique
    }
}

Understand the Managed Mode:

在统一内存模型中,具有 MTLStorageModeManaged 的​​资源 模式驻留在 CPU 和 GPU 均可访问的系统内存中。

行为类似于MTLStorageModeShared只有一份内容副本

注意:

在统一的内存模型中,Metal 可能会忽略 同步调用完全因为它只创建一个 资源的内存分配。


您还可以检查其他开发人员的一些实现:

PixarAnimationStudios/USD:

HgiMetalCapabilities::HgiMetalCapabilities(id<MTLDevice> device)
{
    if (@available(macOS 10.14.5, ios 12.0, *)) {
        _SetFlag(HgiDeviceCapabilitiesBitsConcurrentDispatch, true);
    }

    defaultStorageMode = MTLResourceStorageModeShared;
    bool unifiedMemory = false;
    if (@available(macOS 100.100, ios 12.0, *)) {
        unifiedMemory = true;
    } else if (@available(macOS 10.15, ios 13.0, *)) {
#if defined(ARCH_OS_IOS) || (defined(__MAC_10_15) && __MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_10_15)
        unifiedMemory = [device hasUnifiedMemory];
#else
        unifiedMemory = [device isLowPower];
#endif
    }

    _SetFlag(HgiDeviceCapabilitiesBitsUnifiedMemory, unifiedMemory);

#if defined(ARCH_OS_MACOS)
    if (!unifiedMemory) {
        defaultStorageMode = MTLResourceStorageModeManaged;
    }
#endif
}

KhronosGroup/MoltenVK

// Metal Managed:
//  - applies to both buffers and textures
//  - default mode for textures on macOS
//  - two copies of each buffer or texture when discrete memory available
//  - convenience of shared mode, performance of private mode
//  - on unified systems behaves like shared memory and has only one copy of content
//  - when writing, use:
//      - buffer didModifyRange:
//      - texture replaceRegion:
//  - when reading, use:
//      - encoder synchronizeResource: followed by
//      - cmdbuff waitUntilCompleted (or completion handler)
//      - buffer/texture getBytes:

【讨论】:

  • 感谢您的回答和 sn-ps - Pixar USD sn-p 将非常有用。
  • @trojanfoe,不客气!
猜你喜欢
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2020-02-05
相关资源
最近更新 更多