我正在使用Metal内核计算浮点数组上的简单卷积,如下所述:How to Speed Up Metal Code for iOS/Mac OS
当我设置MTLBuffers来复制数组数据
时,我的程序正常工作<id>MTLBuffer dataBuffer = [device newBufferWithBytes:dataVector length:sizeof(dataVector) options:0];
然后,我可以从输出缓冲区中检索计算值,如此
void *output = [outBuffer contents];
for (int i = 0; i < iterationsCount; ++i) {
outVector[i] = *(float *)(output + 4 * i);
}
我现在正试图通过创建MTLBuffers而不复制数据来实现相同的目标,但是通过共享内存,使用
dataBuffer = [device newBufferWithBytesNoCopy:data length:dataAllocationSize options:MTLResourceStorageModeShared (...)
按照此处所述分配内存: Allocating memory for data used by MTLBuffer in iOS Metal
但是,使用相同的方法来检索输出值,我只获得值为0.0的浮点数
我无法弄清楚我的生活如何实现这一目标。 This有类似的设置,他们检索2.5节中的值,但我不明白如何从Swift翻译......
编辑:显然我的问题不是读取数据,而是首先用数据填充缓冲区。基本上我正在尝试做这个
的Objective-C版本var xvector:UnsafeMutablePointer = nil
var alignment:UInt = 0x4000
var xvectorByteSize:UInt = UInt(maxcount)*UInt(sizeof(Float))
// actual allocation with alignment
posix_memalign(&xvector, alignment, xvectorByteSize)
// pointer handling and casting in Swift..
var xvectorVoidPtr = COpaquePointer(xvector)
var xvectorFloatPtr = UnsafeMutablePointer(xvectorVoidPtr)
var xvectorFloatBufferPtr = UnsafeMutableBufferPointer(start: xvectorFloatPtr, count: maxcount)
// fill xvector with data
for index in xvectorFloatBufferPtr.startIndex..<xvectorFloatBufferPtr.endIndex {
xvectorFloatBufferPtr[index] = Float(Index)
}
来源:Memkite
..但我无法弄清楚如何。
我正在做以下事情,但很明显我现在必须首先调整缓冲区的内存,然后用数据填充它。到目前为止我所做的是首先创建float数组,然后将缓冲区“指向”这个内存,这显然是错误的:
float dataVector[size];
// Fill it up with random values
void *data = dataVector;
NSUInteger dataAllocationSize = sizeof(dataVector) + pageSize - (sizeof(dataVector) % pageSize); NSLog(@"allocation size %lu", (unsigned long)dataAllocationSize);
int result = posix_memalign(&data, pageSize, dataAllocationSize);
// Create the buffer