作为对此答案的跟进问题。我正在尝试用Metal中的内核函数替换在CPU上运行的for循环,以并行化计算并加快性能。
我的函数基本上是卷积。由于我反复接收到输入数组值的新数据(数据源自
当运行此代码时,会出现以下错误:
``` failed assertion `newBufferWithBytesNoCopy:pointer 0x16fd0bd48 is not 4096 byte aligned.' ```
目前,我没有分配任何内存,但(为了测试目的)只是创建一个大小固定的空浮点数数组并用随机数填充它。因此,我的主要问题是:
如何正确地分配这些浮点数数组,以满足以下要求?
``` 该值必须导致页面对齐的内存区域。 ```
另外,还有一些额外的问题:
- 使用 `newBufferWithBytesNoCopy` 方法创建 `MTLBuffer` 是否有意义,或者复制数据在性能方面不是一个问题? (我的实际数据将包含每个视频帧约43000个浮点值。) - `MTLResourceStorageModeShared` 是否是 `MTLResourceOptions` 的正确选择? - API 参考文档说:
``` 返回的新 MTLBuffer 对象的存储分配与指针输入值相同。现有内存分配必须由单个 VM 区域覆盖,通常使用 vm_allocate 或 mmap 分配。不允许使用 malloc 分配内存。 ```
这仅适用于输出缓冲区吗?还是所有用于 `MTLBuffer` 的对象的存储分配都不能使用 `malloc` 进行?
我的函数基本上是卷积。由于我反复接收到输入数组值的新数据(数据源自
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];
当运行此代码时,会出现以下错误:
``` failed assertion `newBufferWithBytesNoCopy:pointer 0x16fd0bd48 is not 4096 byte aligned.' ```
目前,我没有分配任何内存,但(为了测试目的)只是创建一个大小固定的空浮点数数组并用随机数填充它。因此,我的主要问题是:
如何正确地分配这些浮点数数组,以满足以下要求?
``` 该值必须导致页面对齐的内存区域。 ```
另外,还有一些额外的问题:
- 使用 `newBufferWithBytesNoCopy` 方法创建 `MTLBuffer` 是否有意义,或者复制数据在性能方面不是一个问题? (我的实际数据将包含每个视频帧约43000个浮点值。) - `MTLResourceStorageModeShared` 是否是 `MTLResourceOptions` 的正确选择? - API 参考文档说:
``` 返回的新 MTLBuffer 对象的存储分配与指针输入值相同。现有内存分配必须由单个 VM 区域覆盖,通常使用 vm_allocate 或 mmap 分配。不允许使用 malloc 分配内存。 ```
这仅适用于输出缓冲区吗?还是所有用于 `MTLBuffer` 的对象的存储分配都不能使用 `malloc` 进行?
setAlwaysDiscardsLateVideoFrames:YES
,因此在我完成旧帧的所有计算(包括Metal部分)之前,新帧永远不会被处理。在这种情况下,是否不需要创建缓冲池,因为我始终可以使用相同的缓冲区? - Maxi Mus