Аргументы ядра OpenCL - PullRequest
       22

Аргументы ядра OpenCL

2 голосов
/ 08 января 2012

Я только начал возиться с OpenCL и столкнулся с проблемой: я не знаю, как передавать сложные структуры данных в качестве аргументов.Я использую привязку OpenCL от LWJGL, и пример, представленный в вики http://lwjgl.org/wiki/index.php?title=Sum_Example. В этом примере 2 плавающих буфера создаются и передаются в качестве аргументов (LWGJL предоставляет методы в классе с именем BufferUtils для созданияэти буферы).

Теперь, как бы я создал буфер точек, typedef struct {int x, int y} tpoint или структур вообще?В Java нет структур.Более того, нет метода BufferUtils.createStructBuffer.

1 Ответ

1 голос
/ 09 января 2012

Чтение и запись структур OpenCL на хосте может быть нетривиальным.Их расположение в памяти может зависеть от архитектуры устройства OpenCL, и их порядковый номер не обязательно является хостом.

Вы можете управлять размещением с помощью атрибута packed.Если вы используете packed, это точно определяет расположение элементов структуры, в отличие от значения по умолчанию, которое выравнивает элементы в зависимости от архитектуры устройства OpenCL.Однако обратите внимание, что с packed вы можете потерять производительность.

В качестве альтернативы, вы также можете «запросить» устройство OpenCL о структуре struct с небольшим ядром:

kernel void struct_layout(global unsigned long* totalSize, global unsigned long* fieldOffsets)
{
    tpoint theStruct;
    totalSize[0] = sizeof(theStruct);
    unsigned long baseOffset = (unsigned long)&theStruct;
    fieldOffsets[0] = (unsigned long)&theStruct.x - baseOffset;
    fieldOffsets[1] = (unsigned long)&theStruct.y - baseOffset;
}

Дляваш конкретный случай: если вы упаковали структуру tpoint, то из Java вы могли бы просто использовать байтовый буфер и читать / записывать в него значения типа int и чередовать элементы x и y каждого значения структуры.

ByteBuffer buf = ...;

int x1, y1 = ...;
int x2, y2 = ...;

buf.putInt(x1).putInt(y1);
buf.putInt(x2).putInt(y2);
...