Чтение и запись структур 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);