Копирование данных между металлическими текстурами разных форм

Я конвертирую две обученные модели Keras в Metal Performance Shaders. Я должен изменить форму вывода первого графика и использовать его в качестве входных данных для второго графика. Выход первого графика - это MPSImage с "shape" (1,18192), а вывод второго графика - это MPSImage "shape" (4,4,512).

Я приведу выходное изображение graph.texture в Graph1 в виде массива float16 и передам его следующей функции для копирования данных в "midImage", 4x4x512 MPSImage:

func reshapeTexture(imageArray:[Float16]) -> MPSImage{

    let image = imageArray
    image.withUnsafeBufferPointer { ptr in
        let width = midImage.texture.width
        let height = midImage.texture.height
        for slice in 0..<128{
            for w in 0..<width{
                for h in 0..<height{
                    let region = MTLRegion(origin: MTLOriginMake(w, h, 0),
                                           size: MTLSizeMake(1, 1, 1))
                    midImage.texture.replace(region: region, mipmapLevel: 0, slice: slice, withBytes: ptr.baseAddress!.advanced(by: ((slice * 4 * width * height) + ((w + h) * 4)), bytesPerRow: MemoryLayout<Float16>.stride * 4, bytesPerImage: 0)
                }
            }
        }
    }
    return midImage
}

Когда я передаю midImage в graph2, на графике выводится квадрат с искаженным 3/4 шумом, 1/4 черного в нижнем правом углу. Я думаю, что я не понимаю что-то о свойстве слайса MPSImage для хранения дополнительных каналов. Спасибо!

1 ответ

Металлические двухмерные текстурные массивы почти всегда хранятся в порядке Мортона или "Z". Конечно, MPS всегда распределяет их таким образом, хотя я предполагаю, что в MacOS могут быть средства для создания линейного массива 2D-текстур и наложения вокруг него MPSImage. Таким образом, без чрезмерной заботы прямой доступ к хранилищу 2d текстурного массива приведет к печали и замешательству.

Правильный способ сделать это - написать простое ядро ​​для копирования металла. Это дает вам независимость порядка хранения, и вам не нужно ждать завершения буфера команд, прежде чем вы сможете выполнить операцию.

Запрос на функцию в радаре также может быть оправдан. Пожалуйста, ознакомьтесь с последней версией MacOS / iOS, чтобы узнать, добавила ли недавно Apple фильтр изменения формы для вас.

Другие вопросы по тегам