gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:37:32 26 4
gpt4 key购买 nike

我有一个自定义的CIFilter,它是使用CIImageProcessorKernel 的子类实现的。内核本身非常简单:

@implementation ErosionFilterKernel

+ (BOOL)processWithInputs:(NSArray<id<CIImageProcessorInput>> *)inputs
arguments:(NSDictionary<NSString *,id> *)arguments
output:(id<CIImageProcessorOutput>)output
error:(NSError *__autoreleasing *)error
{
error = error ?: &(NSError * __autoreleasing){ nil };

id<MTLCommandBuffer> commandBuffer = output.metalCommandBuffer;
id<MTLTexture> sourceTexture = [inputs.firstObject metalTexture];
id<MTLTexture> destinationTexture = output.metalTexture;

NSInteger distance = [arguments[@"erosionDistance"] integerValue] ?: 1;

MPSImageAreaMin *erodeFilter = [[MPSImageAreaMin alloc] initWithDevice:commandBuffer.device
kernelWidth:distance
kernelHeight:distance];
[erodeFilter encodeToCommandBuffer:commandBuffer sourceTexture:sourceTexture destinationTexture:destinationTexture];
return YES;
}

@end

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

-[MTLDebugComputeCommandEncoder setComputePipelineState:] failed assertion computePipelineState is associated with a different device

这可能是因为负责运行 -encodeToCommandBuffer:sourceTexture:destinationTexture: 的机器内部使用的 MTLComputeCommandEncoder 实例已设置为使用集成 GPU 。我认为这来自从CIImageProcessorOutput对象中提取的commandBuffer

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

最佳答案

使用哪个 GPU 应由执行图像处理的 CIContext 确定。您应该能够使用 [CIContext contextWithMTLDevice:] 初始值设定项指定设备。

顺便说一下,从 macOS 10.15 开始,还有一个内置的 CIMorphologyRectangleMinimum过滤器具有相同的作用。还有一个circular version自 10.13 起可用。

关于objective-c - 如何在 CIImageProcessorKernel 子类中为 Metal Compute 指定设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58664137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com