Моя цель - быстро создать структуру, содержащую массивы, которую я могу упаковать в металлический буфер для использования в функции ядра.
Что-то вроде этого:
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
}
Пример может быть не безупречным, но я думаю, что проблема описана достаточно. Я надеюсь, что у этого есть решение. Если бы не создание переносимых структур, я бы также использовал любое другое решение, которое устраняет избыточность.
1 ответ
Для этого потребуется разместить массивы listA и listB в стеке, что в настоящее время невозможно, поскольку массивы не имеют фиксированного размера и поэтому размещаются в куче.
Чтобы решить эту проблему, вы можете использовать кортежи вместо массивов или объявить свою структуру в коде C. Вы даже можете поделиться объявлением структуры с вашим металлическим кодом, поместив их в файл заголовка C.
Этот ответ может вам помочь.
Похожие вопросы
Связанные вопросы
Новые вопросы
arrays
Массив - это упорядоченная линейная структура данных, состоящая из набора элементов (значений, переменных или ссылок), каждый из которых идентифицируется одним или несколькими индексами. Когда вы спрашиваете о конкретных вариантах массивов, используйте вместо них следующие связанные теги: [vector], [arraylist], [matrix]. При использовании этого тега в вопросе, относящемся к языку программирования, пометьте вопрос используемым языком программирования.