【发布时间】:2017-02-07 18:41:22
【问题描述】:
作为this answer 的后续问题。我正在尝试用 Metal 中的内核函数替换 CPU 上运行的 for 循环,以并行计算并提高性能。
我的函数基本上是一个卷积。由于我反复收到输入数组值的新数据(数据来自AVCaptureSession),因此使用newBufferWithBytesNoCopy:length:options:deallocator: 似乎是创建MTLBuffer 对象的明智选择。以下是相关代码:
id <MTLBuffer> dataBuffer = [device newBufferWithBytesNoCopy:dataVector length:sizeof(dataVector) options:MTLResourceStorageModeShared deallocator:nil];
id <MTLBuffer> filterBuffer = [device newBufferWithBytesNoCopy:filterVector length:sizeof(filterVector) options:MTLResourceStorageModeShared deallocator:nil];
id <MTLBuffer> outBuffer = [device newBufferWithBytesNoCopy:outVector length:sizeof(outVector) options:MTLResourceStorageModeShared deallocator:nil];
运行时出现以下错误:
断言失败 `newBufferWithBytesNoCopy:pointer 0x16fd0bd48 is not 4096 byte alignment.'
现在,我没有分配任何内存,但(出于测试目的)只是创建一个固定大小的空浮点数组并用随机数填充它。所以我的主要问题是:
如何正确分配这些浮点数组,以满足以下要求
此值必须导致内存的页面对齐区域。
另外,还有一些问题:
- 使用
newBufferWithBytesNoCopy方法创建MTLBuffer是否有意义,或者复制数据在性能方面不是真正的问题? (我的实际数据将包含每个视频帧大约 43,000 个浮点值。) -
MTLResourceStorageModeShared是MTLResourceOptions的正确选择吗? -
API 参考说明
返回的新MTLBuffer对象的存储分配与指针输入值相同。现有的内存分配必须由单个 VM 区域覆盖,通常使用 vm_allocate 或 mmap 进行分配。明确禁止 malloc 分配的内存。
这是否仅适用于输出缓冲区,或者是否应该为
MTLBuffer使用的所有对象分配存储空间而不是malloc?
【问题讨论】:
标签: ios c memory-management gpgpu metal