作为后续问题这个答案。我正在尝试用 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:指针 0x16fd0bd48 未 4096 字节对齐”失败。
现在,我没有分配任何内存,但(出于测试目的)只是创建一个固定大小的空浮点数数组并用随机数填充它。所以我的主要问题是:
如何以正确的方式分配这些浮点数组以满足以下要求
该值必须产生页对齐的内存区域。
另外,还有一些补充问题:
分配页对齐内存的最简单方法是posix_memalign
。下面是创建具有页对齐内存的缓冲区的完整示例:
void *data = NULL;
NSUInteger pageSize = getpagesize();
NSUInteger allocationSize = /* required byte count, rounded up to next multiple of page size */ pageSize * 10;
int result = posix_memalign(&data, pageSize, allocationSize);
if (result == noErr && data) {
id<MTLBuffer> buffer = [device newBufferWithBytesNoCopy:data
length:allocationSize
options:MTLResourceStorageModeShared
deallocator:^(void *pointer, NSUInteger length)
{
free(pointer);
}];
NSLog(@"Created buffer of length %d", (int)buffer.length);
}
由于您无法确保数据将到达页面对齐的指针,因此最好只分配一个MTLBuffer
任何大小都可以容纳您的数据,而无需使用无复制变体。如果需要对数据进行实时处理,则应该创建一个缓冲区池并在它们之间循环,而不是等待每个命令缓冲区完成。这Shared
存储模式对于这些用例来说是正确的。相关警告malloc
仅适用于无复制情况,因为在所有其他情况下,Metal 都会为您分配内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)