使用bytesNoCopy(共享内存)创建的缓冲区的MTLBuffer输出值全为零

时间:2016-10-05 16:17:49

标签: ios buffer shared-memory metal

我正在使用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

0 个答案:

没有答案