Объедините несколько буферов OpenCL в один большой буфер - PullRequest
0 голосов
/ 31 августа 2011

У меня есть двумерный массив, который я разделил на несколько одномерных массивов и превратил эти одномерные массивы в буферы OpenCL. Иногда мне нужна функция ядра, чтобы взять весь 2D-массив, но так как его размер определяется во время выполнения, я не могу просто сделать достаточно аргументов ядра, так как есть одномерные массивы (плюс может быть более 1000 одномерных массивов). Я надеюсь, что есть какой-то способ взять массив 1D, содержащий буферы OpenCL, объединить их в один большой буфер, содержащий все данные, и отправить его в мое ядро. Прямо сейчас единственный способ, которым я могу видеть это, - это если я прочитаю данные из 1D-буферов обратно в свою программу, расположу их в гигантском 1D-массиве и запишу новый буфер обратно в мое вычислительное устройство, похоже, это будет чрезвычайно медленно, есть ли другой способ?

Ответы [ 2 ]

3 голосов
/ 31 августа 2011

Вот пара идей (хотя я признаю, что они не идеальны).

Вместо того, чтобы копировать буферы обратно в вашу программу, а затем создавать из нее новые буферы, вы можете использовать метод clEnqueueCopyBuffer()(или clEnqueueCopyBufferRect(), в зависимости от вашей ситуации) для копирования данных из одного буфера в другой.Я верю (но я бы не стал клясться в этом), что способ выполнения этой копии зависит от реализации, но кажется, что буфер, который находится в памяти устройства, можно скопировать в другой буфер в памяти устройства без необходимости пересекать шину назад.для размещения памяти.

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

Таким образом, вы можете передать буфер, который представляет весь 2D-массив, когда это необходимо, но просто передать один или несколько 1D подбуферов, когда это все, что требуется.

0 голосов
/ 18 сентября 2011

Я протестировал clCreateSubBuffer (с его выпуском) и увидел, что он медленнее, чем копирование, лучше, чем создание / выпуск, но ... :( система: OpenCL 1.1 AMD-APP-SDK-v2.5 (684.212) FULL_PROFILE Radeon 5870

...