我正在使用 Tensorrt 转换 caffe 模型,当我在嵌入式设备中运行代码时,它会提示分段错误。我知道问题出在“network->destroy();”,如果我注释掉这段代码,它不会显示“segmentation fault”。
我找到了一些方法并尝试解决这个问题,但它不起作用。此问题的常见原因:printf
or语句中的格式控制字符串不正确:确保格式控制字符串与or具有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() {}
};