Я пытаюсь позволить нейронной сети работать на металле. Основная идея заключается в дублировании данных. Каждый поток gpu запускает одну версию сети для случайных точек данных.
Я написал другие шейдеры, которые отлично работают.
Я также пробовал свой код в приложении командной строки С++. Ошибок нет. Также нет ошибки компиляции.
Я использовал документацию apple для преобразования в metal С++, так как поддерживается не все, начиная с С++ 11.
Он вылетает после загрузки функции ядра и при попытке назначить newComputePipelineStateWithFunction
на металлическое устройство. Это означает, что есть проблема с кодом, который не был обнаружен во время компиляции.
MCVE:
kernel void net(const device float *inputsVector [[ buffer(0) ]], // layout of net *
uint id [[ thread_position_in_grid ]]) {
uint floatSize = sizeof(tempFloat);
uint inputsVectorSize = sizeof(inputsVector) / floatSize;
float newArray[inputsVectorSize];
float test = inputsVector[id];
newArray[id] = test;
}
Обновление
Он имеет все, что связано с динамическими массивами.
Поскольку он не создает состояние конвейера и не запускает фактический шейдер, он должен быть проблемой кодирования. Не проблема ввода.
Назначение значений из динамического массива в буфер заставляет его сбой.