ios - Metal IOS 简单直通计算内核在 iphone 5s 上需要 10 毫秒

标签 ios gpu gpgpu metal

我创建了简单的直通计算内核

kernel void filter(texture2d<float, access::read> inTexture [[texture(0)]],
                         texture2d<float, access::write> outTexture [[texture(1)]],
                         uint2 gridPos [[ thread_position_in_grid ]]) {
  float4 color = inTexture.read(gridPos);
  outTexture.write(color, gridPos);
}

测量执行时间

[self.timer start];
[commandBuffer commit];
[commandBuffer waitUntilCompleted];
CGFloat ms = [self.timer elapse];

定时器类的工作原理如下:

- (void)start {
  self.startMach = mach_absolute_time();
}  

- (CGFloat)elapse {
  uint64_t end = mach_absolute_time();
  uint64_t elapsed = end - self.startMach;
  uint64_t nanosecs = elapsed * self.info.numer / self.info.denom;
  uint64_t millisecs = nanosecs / 1000000;

  return millisecs;
}

调度调用:

static const NSUInteger kGroupSize = 16;
- (MTLSize)threadGroupSize {
  return MTLSizeMake(kGroupSize, kGroupSize, 1);
}

- (MTLSize)threadGroupsCount:(MTLSize)threadGroupSize {
  return MTLSizeMake(self.provider.texture.width / kGroupSize,
                 self.provider.texture.height / kGroupSize, 1);
}

[commandEncoder dispatchThreadgroups:threadgroups 
               threadsPerThreadgroup:threadgroupSize];

在 512x512 rgba 图像上给我 13 毫秒,如果我执行更多遍,它会呈线性增长。

这是正确的吗?对于实时应用程序来说似乎开销太大。

最佳答案

众所周知,计算内核在 A7 处理器上具有相当高的开销。不过,需要考虑的一件事是,这基本上是您可以运行的最不讨人喜欢的测试:一次性线程组调度可能需要约 2 毫秒才能调度,但后续调度的调度可能会快一个数量级。此外,这里隐藏延迟的可能性很小。实际上,更复杂的内核可能不会花费更长的时间来执行,并且如果您可以将其与您可能正在执行的任何渲染交错,您可能会发现性能是可以接受的。

关于ios - Metal IOS 简单直通计算内核在 iphone 5s 上需要 10 毫秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38360750/

相关文章:

CUDA 7.5 安装 : Unsupported compiler error

c# - 由于显卡内存不足而导致 WPF 3D 性能问题?

gpu - GCE 上 100% GPU 利用率,无需任何进程

java - OpenCL中如何知道内存映射成功

c - 如何将指针分配给此数组(OpenCL)中某些结构的数组元素?

multithreading - 多线程反向传播

ios - 如何重复请求 api 调用,直到 swift 得到结果

ios - FIRInstallations使Firebase iOS SDK崩溃validateAppOptions:appName

ios - 获取文档路径后获取文件路径

ios - 列出应用程序可用的语言