For multiple inputs in plugin, what should be the source for
void copyDeviceInputToFP32(const void* src, void*& dst){}?
Sample has only one source as follows. If I have two sources, how to implement src and dst?
void copyDeviceInputToFP32(const void* src, void*& dst)
{
assert(mDataType == DataType::kINT8);
size_t inCount = getC(mInputDims) * getH(mInputDims) * getW(mInputDims);
std::unique_ptr<char> inputTmp{new char[inCount * elementSize(mDataType)]};
CHECK(cudaMemcpy(inputTmp.get(), src, inCount * elementSize(mDataType), cudaMemcpyDeviceToHost));
std::unique_ptr<float> inputFP32{new float[inCount]};
transform<DataType::kINT8, DataType::kFLOAT>(inputTmp.get(), inputFP32.get(), inCount);
// int8 scale
int hw = mInputDims.d[1] * mInputDims.d[2];
for (int j = 0; j < mInputDims.d[0]; ++j)
{
std::transform(inputFP32.get() + hw * j, inputFP32.get() + hw * (j + 1), inputFP32.get() + hw * j,
[&](float in) -> float { return in * mInHostScale; });
}
CHECK(cudaMalloc(&dst, inCount * elementSize(DataType::kFLOAT)));
CHECK(cudaMemcpy(dst, inputFP32.get(), inCount * elementSize(DataType::kFLOAT), cudaMemcpyHostToDevice));
}
Hi @edit_or
I am not sure which sample you are referring to?
Please take reference from the sample plugin link
https://github.com/NVIDIA/TensorRT/tree/master/samples/opensource/samplePlugin
Thanks!
They are from IPluginV2IOExt sample.
There are two methods for Int8 conversions.
void copyDeviceInputToFP32(const void* src, void*& dst)
{
assert(mDataType == DataType::kINT8);
size_t inCount = getC(mInputDims) * getH(mInputDims) * getW(mInputDims);
std::unique_ptr<char> inputTmp{new char[inCount * elementSize(mDataType)]};
CHECK(cudaMemcpy(inputTmp.get(), src, inCount * elementSize(mDataType), cudaMemcpyDeviceToHost));
std::unique_ptr<float> inputFP32{new float[inCount]};
transform<DataType::kINT8, DataType::kFLOAT>(inputTmp.get(), inputFP32.get(), inCount);
// int8 scale
int hw = mInputDims.d[1] * mInputDims.d[2];
for (int j = 0; j < mInputDims.d[0]; ++j)
{
std::transform(inputFP32.get() + hw * j, inputFP32.get() + hw * (j + 1), inputFP32.get() + hw * j,
[&](float in) -> float { return in * mInHostScale; });
}
CHECK(cudaMalloc(&dst, inCount * elementSize(DataType::kFLOAT)));
CHECK(cudaMemcpy(dst, inputFP32.get(), inCount * elementSize(DataType::kFLOAT), cudaMemcpyHostToDevice));
}
void copyDeviceToInt8Output(const void* src, void* dst)
{
size_t outCount = getC(mOutputDims) * getH(mOutputDims) * getW(mOutputDims);
std::unique_ptr<float> outTmp{new float[outCount]};
CHECK(cudaMemcpy(outTmp.get(), src, outCount * elementSize(DataType::kFLOAT), cudaMemcpyDeviceToHost));
std::unique_ptr<char> outInt8{new char[outCount * elementSize(DataType::kINT8)]};
// int8 + scale
int hw = mOutputDims.d[1] * mOutputDims.d[2];
for (int j = 0; j < mInputDims.d[0]; ++j)
{
std::transform(outTmp.get() + hw * j, outTmp.get() + hw * (j + 1), outTmp.get() + hw * j,
[&](float in) -> float { return in / mOutHostScale; });
}
transform<DataType::kFLOAT, DataType::kINT8>(outTmp.get(), outInt8.get(), outCount);
CHECK(cudaMemcpy(dst, outInt8.get(), outCount, cudaMemcpyHostToDevice));
}
How can I manage src and dst in the conversions if I have two sources?
May I have reply for this?
Hi @edit_or,
Are you still facing the issue?