Вот пара идей (хотя я признаю, что они не идеальны).
Вместо того, чтобы копировать буферы обратно в вашу программу, а затем создавать из нее новые буферы, вы можете использовать метод clEnqueueCopyBuffer()
(или clEnqueueCopyBufferRect()
, в зависимости от вашей ситуации) для копирования данных из одного буфера в другой.Я верю (но я бы не стал клясться в этом), что способ выполнения этой копии зависит от реализации, но кажется, что буфер, который находится в памяти устройства, можно скопировать в другой буфер в памяти устройства без необходимости пересекать шину назад.для размещения памяти.
Конечно (если я правильно понимаю), копирование не совсем то, что вы хотели в любом случае.Как насчет использования метода clCreateSubBuffer()
?Этот метод может создать новый буфер, который просто указывает на подсекцию существующего буфера (без создания собственной копии).Для этого (из моего понимания того, что вы описали) вам потребуется создать большой 2D-буфер, а затем создать несколько легких 1-мерных буферов, которые указывают на области этой памяти.
Таким образом, вы можете передать буфер, который представляет весь 2D-массив, когда это необходимо, но просто передать один или несколько 1D подбуферов, когда это все, что требуется.