blob: ae8202389d8969f4f239aa4710bad7c23f060a1b [file] [log] [blame]
#include "caffe2/core/init.h"
#include "caffe2/core/flags.h"
#include "nervana_c_api.h"
C10_DEFINE_string(
nervana_cubin_path,
"/usr/local/fbcode/gcc-4.8.1-glibc-2.17/lib/cubin/",
"The cubin path for nervana kernels. Currently defaulted "
"to the internal fb deployment path.");
namespace caffe2 {
namespace {
static bool g_nervana_kernel_loaded = false;
} // namespace
bool NervanaKernelLoaded() { return g_nervana_kernel_loaded; }
bool Caffe2InitializeNervanaKernels(int*, char***) {
// If we do not specify the nervana cubin path, we will simply return.
if (FLAGS_nervana_cubin_path.size() == 0) {
VLOG(1) << "Nervana cubin loading skipped.";
return true;
}
g_nervana_kernel_loaded =
nervana_loadKernels(FLAGS_nervana_cubin_path.c_str());
if (g_nervana_kernel_loaded) {
VLOG(1) << "Loaded nervana kernels from path "
<< FLAGS_nervana_cubin_path;
} else {
// Since this is not a critical error we will just vlog it.
VLOG(1) << "Cannot load nervana gpu kernels from path "
<< FLAGS_nervana_cubin_path
<< ", will disable Caffe2 nervana engines.";
}
// We will always return true for this initialization, because the loading
// result is kept and accessible via NervanaKernelLoaded(). This allows us
// to register an init function but not forcing the user to have to install
// nervana kernels, delaying the failure to the first time a nervana kernel
// is actually called.
return true;
}
REGISTER_CAFFE2_INIT_FUNCTION(Caffe2InitializeNervanaKernels,
&Caffe2InitializeNervanaKernels,
"Initialize nervana kernels for caffe2.");
} // namespace caffe2