当我运行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?
答案 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
来强制链接这些构造函数。