В настоящее время я передаю данные изображения и глубины с моего iphone X и выполняю серию вычислений на нем, используя ядро compute metal. Выход каждого цикла (кадра) составляет примерно 900 000 операций с плавающей запятой. Предполагая, что имеется 30 циклов (кадров) в секунду, это представляет 27 миллионов операций с плавающей запятой в секунду.
Я хотел бы сохранить несколько секунд (3-5) этих данных в файл, к которому я смогу получить доступ позже,
Мой текущий подход к записи выходных данных в каждом цикле слишком медленный (ввод-вывод дорогой), и я не уверен, как правильно буферизовать результаты нескольких циклов (я пытался создать массив массивов, но потомстолкнуться с проблемами с памятью).
Копировать данные из буферов MTL:
//number of elements per frame approx 300,000
size_t len = elementCount
finalArrayX = new float [len];
finalArrayY = new float [len];
finalArrayZ = new float [len];
//MTLBuffers
finalArrayX = (float*) resultsBufferX.contents;
finalArrayY = (float*) resultsBufferY.contents;
finalArrayZ = (float*) resultsBufferZ.contents;
writeToFile(finalArrayX, finalArrayY, finalArrayZ)
writeToFile:
/*
* Get file handle to append to
*/
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *documentTXTPath = [documentsDirectory stringByAppendingPathComponent:@"test.txt"];
if(![[NSFileManager defaultManager] fileExistsAtPath: documentTXTPath]) {
[[NSFileManager defaultManager] createFileAtPath: documentTXTPath contents:nil attributes:nil];
}
NSFileHandle *myHandle = [NSFileHandle fileHandleForWritingAtPath:documentTXTPath];
[myHandle seekToEndOfFile];
/*
* Create strings and write line by line
*/
for(int k = 0; k < elementCount; k ++){
NSString *x_i = [NSString stringWithFormat:@"%.2f", finalArrayX[k]];
NSString *y_i = [NSString stringWithFormat:@"%.2f", finalArrayY[k]];
NSString *z_i = [NSString stringWithFormat:@"%.2f", finalArrayZ[k]];
NSString *temp = [line stringByAppendingString: x_i];
temp = [temp stringByAppendingString: @" "];
NSString *tempTwo = [temp stringByAppendingString: y_i];
tempTwo = [tempTwo stringByAppendingString: @" "];
NSString *tempThree = [tempTwo stringByAppendingString: z_i];
NSString *totalLine = [tempThree stringByAppendingString: @"\n"];
[myHandle writeData:[totalLine dataUsingEncoding:NSUTF8StringEncoding]];
}
Как лучше всего это сделать?