我正在使用Tensorrt转换caffe模型,并且在嵌入式设备中运行代码时,它提示分段错误。 我知道问题出在“ network-> destroy();”,如果我用这段代码注释掉,它不会显示“分段错误”。
我找到了一些方法来尝试解决此问题,但是它不起作用。
此问题的常见原因:
printf
或scanf
语句中格式控制字符串不正确:
确保格式控制字符串具有与%'s
或printf
相同的转换说明符(scanf
)数目,并且分别具有要打印或读取的参数,并且说明符与类型匹配要打印或读取的变量。这也适用于fprintf
和fscanf
。
忘记在scanf的参数上使用“&”:
函数scanf以格式控制字符串和变量地址作为参数,它将在其中放入要读取的数据。“&”(的地址)运算符用于提供变量的地址。通常忘记在scanf调用中对每个变量使用“&”。省略“&”会导致细分冲突。
访问超出数组范围的内容:
确保您没有违反所使用的任何数组的界限;也就是说,您尚未为数组下标小于其最低元素的索引或大于其最高元素的索引的值。
在访问指针之前未能初始化指针:
指针变量必须在访问之前(即,显示在分配的右侧)分配有效地址(即,显示在分配的左侧)。确保已初始化所有指针以指向内存的有效区域。正确的指针初始化可以通过几种方法完成。示例如下。
错误使用“&”(的地址)和“ ”(取消引用)运算符:
确保您了解这些操作员的工作方式。知道何时应该应用它们,何时不应用它们。如上所述,通常忘记在scanf
调用中对每个变量使用“&”。请记住,scanf
需要读取的变量的地址。尤其是,知道何时绝对需要“&”和“ ”,以及何时最好避免使用它们。
此代码用于Caffe模型到tenserrt模型 tenserNet.cpp
builder = createInferBuilder(gLogger);
INetworkDefinition* network = builder->createNetwork();
ICaffeParser* parser = createCaffeParser();
parser->setPluginFactory(NULL);
bool useFp16 = builder->platformHasFastFp16();
//useFp16 = false;
DataType modelDataType = useFp16 ? DataType::kHALF : DataType::kFLOAT;
/** Debugging Notes
* 1. The datatype is taken by the code.
* 2. The network is properly defined here. A network is created here.
* 3. There is some error with the deploy file.
* 4. parser used here is nvCaffeParser.
* 5. blobNameToTensor also has some name.
* */
// const IBlobNameToTensor* blobNameToTensor = parser->parse(deployFile.c_str(),
// modelFile.c_str(),
// *network,
// DataType::kFLOAT);
const IBlobNameToTensor* blobNameToTensor = parser->parse(deployFile.c_str(),
modelFile.c_str(),
*network,
modelDataType);
assert(blobNameToTensor != nullptr);
for (auto& s : outputs) network->markOutput(*blobNameToTensor->find(s.c_str()));
builder->setMaxBatchSize(maxBatchSize);
builder->setMaxWorkspaceSize(16 << 20);
//IRuntime* infer;
infer = createInferRuntime(gLogger);
if(useFp16)
{
builder->setHalf2Mode(true);
}
engine = builder->buildCudaEngine( *network );
assert(engine);
context = engine->createExecutionContext();
assert(context);
network->destroy();
parser->destroy();
//gieModelStream = engine->serialize();
// engine->destroy();
// builder->destroy();
// pluginFactory.destroyPlugin();
// shutdownProtobufLibrary();
context->setProfiler(&gProfiler);
// context->setProfiler(nullptr);
CUDA_VERIFY(cudaStreamCreate(&stream));
NvInfer.h
class INetworkDefinition
{
// ...
virtual void destroy() = 0;
protected:
virtual ~INetworkDefinition() {}
};