Caffe是否包含静态初始化惨败?

时间:2016-09-20 19:16:34

标签: c++ caffe

当我运行Caffe.exe时,它会这样做:

cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, 0);
Caffe::SetDevice(0);
Caffe::set_mode(Caffe::GPU);
Net<float> caffe_net(modelFile, caffe::TEST);
caffe_net.CopyTrainedLayersFrom(weightsFile);

并且所有图层都静态添加到LayerRegistry中,一切都按预期运行。

但是如果我将Net作为封闭类的指针成员并将初始化放在构造函数中,那么层将静态添加到LayerRegistry中:

class Foo
{
   Foo();
   std::unique_ptr< Net<float> > net;
}

Foo::Foo()
{
   cudaDeviceProp deviceProp;
   cudaGetDeviceProperties(&deviceProp, 0);
   Caffe::SetDevice(0);
   Caffe::set_mode(Caffe::GPU);
   Net<float> caffe_net(modelFileName, caffe::TEST);
   net.reset(new Net<float>(modelFileName, caffe::TEST));
   net->CopyTrainedLayersFrom(weightsFileName);
}

在layer_factory。*我看到图层有宏REGISTER_LAYER_CREATOR,宏定义为:

#define REGISTER_LAYER_CREATOR(type, creator)                                  \
  static LayerRegisterer<float> g_creator_f_##type(#type, creator<float>);     \
  static LayerRegisterer<double> g_creator_d_##type(#type, creator<double>)    \

Caffe是否包含static initialization fiasco

1 个答案:

答案 0 :(得分:0)

答案是“不”。

正如@TravisGockel在上面的评论中指出的那样,问题是当LayerRegisterer构造函数位于静态库中时,需要强制它们与DLL或可执行文件链接。

对于Visual Studio C ++,如Forcing Construction of Global Objects in Static Libraries中所述,解决方案是通过将Project|Properties|References|libcaffe|Project Reference Properties|Use Library Dependency Inputs设置为true来强制链接这些构造函数。