я использую TensorRT 2.1
и хотите реализовать простой пользовательский слой. (Цель состоит в том, чтобы бежать Single Shot Detector
с помощью TensorRT
на системе вложения.)
На практике я хотел сделать Inc
слой (просто добавив 1.0 к значениям входного тензора и сохранив размерность одинаковой).
Я реализую Inc
класс, следующий за class Reshape : public Iplugin
в sampleFasterRNN.cpp
пример. Я сохранил почти все, кроме getOutputDimensions()
чтобы сохранить то же измерение. (это выглядит хорошо.)
Где я должен реализовать часть «добавление 1.0»? Я думаю, это должно быть в «enqueue ()». Итак, я попробовал
int enqueue(int batchSize, const void*const *inputs, void** outputs, void*, cudaStream_t stream) override
{
# the below is from the Reshape class. seems to copy from input to output
CHECK(cudaMemcpyAsync(outputs[0], inputs[0], mCopySize * batchSize, cudaMemcpyDeviceToDevice, stream));
# add 1.0 to first ten values
float* foutputs = (float*) outputs[0];
int i; for (i = 0; i < 10; i++) foutputs[i] += 1.0;
return 0;
}
Однако эта часть приводит к ошибке «ошибка сегментации».
Мои вопросы:
Обратитесь к файлу samples/samplePlugin/samplePlugin.cpp
и посмотрите на FCPlugin
учебный класс. Ваше фактическое вычисление должно идти в enqueue
метод. Возможно, вам придется написать ядро CUDA, которое выполняет приращение.
Других решений пока нет …