Моя цель - быстро создать структуру, содержащую массивы, которую я могу упаковать в металлический буфер для использования в функции ядра.

Что-то вроде этого:

struct StructA  {
  var listA: [StructB] = [StructB](repeating: StructB(), count: 100)
  var listB: [StructC] = [StructC](repeating: StructC(), count: 100)
  var primitiveA: Int = 0
  var primitiveB: Int = 0
}

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

В настоящее время мой обходной путь состоит в том, чтобы упаковать listA и listB в два отдельных буфера, установить их как параметры моей функции ядра, а внутри функции ядра назначить их StructA, который создается в каждом потоке, что является сумасшедшей избыточностью.

kernel void functionA(
  const device StructB *listA [[buffer(0)]],
  const device StructC *listB [[buffer(1)]],
  device int &primitiveA [[buffer(2)]],
  device int &primitiveB [[buffer(3)]],
) {
  StructA structA = StructA(); //create a struct in each and every thread
  structA.listA = listA;       //and assign the same lists to the struct
  structA.listB = listB;       //that is the same in every thread
  structA.primitiveA = primitiveA;
  structA.primitiveB = primitiveB;

  //do stuff with structA
}

Пример может быть не безупречным, но я думаю, что проблема описана достаточно. Я надеюсь, что у этого есть решение. Если бы не создание переносимых структур, я бы также использовал любое другое решение, которое устраняет избыточность.

3
Enie 25 Июн 2017 в 14:33

1 ответ

Лучший ответ

Для этого потребуется разместить массивы listA и listB в стеке, что в настоящее время невозможно, поскольку массивы не имеют фиксированного размера и поэтому размещаются в куче.

Чтобы решить эту проблему, вы можете использовать кортежи вместо массивов или объявить свою структуру в коде C. Вы даже можете поделиться объявлением структуры с вашим металлическим кодом, поместив их в файл заголовка C.

Этот ответ может вам помочь.

1
Palle 25 Июн 2017 в 15:12
Я уже видел объявление структуры в C. Теперь я наконец знаю, зачем кому-то это делать. Спасибо!
 – 
Enie
25 Июн 2017 в 16:26