2016-09-20 38 views
0

当我运行Caffe.exe,它这样做:Caffe是否包含静态初始化失败?

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,一切运行正常。

但是,如果我做网络的封闭类的指针成员,并把构造函数中初始化,那么层是静态加入到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

+0

我根本不知道'Caffe',所以带上一粒盐吧。 'Foo :: Foo()'和'REGISTER_LAYER_CREATOR'中的代码之间有什么关系? –

+0

@RSahu Net包含静态初始化的层注册表,该注册表基于宏进行静态初始化。 Caffe是......复杂的,所以有知识的人可能需要回答。 – empty

+0

您是否试过用'-Wl, - 不需要的(或者MSVC相当于什么)编译? –

回答

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来强制链接这些构造函数。