diff --git a/CMakeLists.txt b/CMakeLists.txt index a86435f9900f..7c479f756295 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -701,7 +701,6 @@ if(UNIX) add_library(mxnet SHARED ${DUMMY_SOURCE}) target_link_libraries(mxnet PRIVATE ${BEGIN_WHOLE_ARCHIVE} $ ${END_WHOLE_ARCHIVE}) target_link_libraries(mxnet PRIVATE mxnet_static) - target_link_libraries(mxnet_static PUBLIC ${CMAKE_DL_LIBS}) set_target_properties(mxnet_static PROPERTIES OUTPUT_NAME mxnet) else() add_library(mxnet SHARED ${SOURCE}) diff --git a/Makefile b/Makefile index f1e21d6fa945..b54df174acde 100644 --- a/Makefile +++ b/Makefile @@ -107,7 +107,7 @@ else CFLAGS += -O3 -DNDEBUG=1 endif CFLAGS += -I$(TPARTYDIR)/mshadow/ -I$(TPARTYDIR)/dmlc-core/include -fPIC -I$(NNVM_PATH)/include -I$(DLPACK_PATH)/include -I$(TPARTYDIR)/tvm/include -Iinclude $(MSHADOW_CFLAGS) -LDFLAGS = -pthread -ldl $(MSHADOW_LDFLAGS) $(DMLC_LDFLAGS) +LDFLAGS = -pthread $(MSHADOW_LDFLAGS) $(DMLC_LDFLAGS) ifeq ($(ENABLE_TESTCOVERAGE), 1) CFLAGS += --coverage diff --git a/example/lib_api/Makefile b/example/lib_api/Makefile deleted file mode 100644 index e5893c8065c4..000000000000 --- a/example/lib_api/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -all: - g++ -shared -fPIC mylib.cc -o mylib.so -I ../../include/mxnet - -test: - g++ -std=c++11 -O3 -o libtest libtest.cc -ldl -I ../../include/mxnet - -windows: - cl /LD mylib.cc - -win_test: - cl libtest.cc - -clean: - rm -rf mylib.so libtest diff --git a/example/lib_api/libtest.cc b/example/lib_api/libtest.cc deleted file mode 100644 index 8bdf36c05d37..000000000000 --- a/example/lib_api/libtest.cc +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/*! - * Copyright (c) 2015 by Contributors - * \file libtest.cc - * \brief This test checks if the library is implemented correctly - * and does not involve dynamic loading of library into MXNet - * This test is supposed to be run before test.py - */ - -#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) -#include -#else -#include -#endif - -#include -#include "lib_api.h" - -#define MXNET_VERSION 10500 - -int main(void) { - // Get a handle to the library. -#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) - HINSTANCE handle; - handle = LoadLibrary(TEXT("mylib.dll")); -#else - void *handle; - handle = dlopen("mylib.so", RTLD_LAZY); -#endif - - if (!handle) { - std::cerr << "Unable to load library" << std::endl; - return 1; - } - - // get initialize function address from the library - initialize_t init_lib; -#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) - init_lib = (initialize_t) GetProcAddress(handle, MXLIB_INITIALIZE_STR); -#else - init_lib = (initialize_t) dlsym(handle, MXLIB_INITIALIZE_STR); -#endif - - if (!init_lib) { - std::cerr << "Unable to get function 'intialize' from library" << std::endl; - return 1; - } - - // Call the function. - (init_lib)(MXNET_VERSION); - - // Deallocate memory. -#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) - FreeLibrary(handle); -#else - dlclose(handle); -#endif - - return 0; -} diff --git a/example/lib_api/mylib.cc b/example/lib_api/mylib.cc deleted file mode 100644 index e67560a87f3d..000000000000 --- a/example/lib_api/mylib.cc +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/*! - * Copyright (c) 2015 by Contributors - * \file mylib.cc - * \brief Sample library file - */ - -#include -#include "lib_api.h" - -int initialize(int version) { - if (version >= 10400) { - std::cout << "MXNet version " << version << " supported" << std::endl; - return 1; - } else { - std::cout << "MXNet version " << version << " not supported" << std::endl; - return 0; - } -} diff --git a/example/lib_api/test.py b/example/lib_api/test.py deleted file mode 100644 index d73d85c02ced..000000000000 --- a/example/lib_api/test.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python3 - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# coding: utf-8 -# pylint: disable=arguments-differ - -# This test checks if dynamic loading of library into MXNet is successful - -import mxnet as mx -import os - -if (os.name=='posix'): - mx.library.load('mylib.so') -elif (os.name=='nt'): - mx.library.load('mylib.dll') diff --git a/include/mxnet/c_api.h b/include/mxnet/c_api.h index 376c7e9d1063..058f859ae7bc 100644 --- a/include/mxnet/c_api.h +++ b/include/mxnet/c_api.h @@ -226,13 +226,6 @@ MXNET_DLL const char *MXGetLastError(); // Part 0: Global State setups //------------------------------------- -/*! - * \brief Load library dynamically - * \param path to the library .so file - * \return 0 when success, -1 when failure happens. - */ -MXNET_DLL int MXLoadLib(const char *path); - /*! * \brief Get list of features supported on the runtime * \param libFeature pointer to array of LibFeature diff --git a/include/mxnet/lib_api.h b/include/mxnet/lib_api.h deleted file mode 100644 index ca3b2952eafa..000000000000 --- a/include/mxnet/lib_api.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/*! - * Copyright (c) 2015 by Contributors - * \file lib_api.h - * \brief APIs to interact with libraries - */ -#ifndef MXNET_LIB_API_H_ -#define MXNET_LIB_API_H_ - -/*! - * \brief Following are the APIs implemented in the external library - * Each API has a #define string that is used to lookup the function in the library - * Followed by the function declaration - */ -#define MXLIB_INITIALIZE_STR "initialize" -typedef int (*initialize_t)(int); - -extern "C" { - /*! - * \brief Checks if the MXNet version is supported by the library. - * If supported, initializes the library. - * \param version MXNet version number passed to library and defined as: - * MXNET_VERSION = (MXNET_MAJOR*10000 + MXNET_MINOR*100 + MXNET_PATCH) - * \return Non-zero value on error i.e. library incompatible with passed MXNet version - */ -#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) - __declspec(dllexport) int __cdecl initialize(int); -#else - int initialize(int); -#endif -} -#endif // MXNET_LIB_API_H_ diff --git a/python/mxnet/__init__.py b/python/mxnet/__init__.py index 233bb2a1f57e..ab4bffde28a9 100644 --- a/python/mxnet/__init__.py +++ b/python/mxnet/__init__.py @@ -26,7 +26,6 @@ from .base import MXNetError from .util import is_np_shape, set_np_shape, np_shape, use_np_shape from . import base -from . import library from . import contrib from . import ndarray from . import ndarray as nd diff --git a/python/mxnet/base.py b/python/mxnet/base.py index 17819bde28b2..bf8026359d02 100644 --- a/python/mxnet/base.py +++ b/python/mxnet/base.py @@ -86,7 +86,7 @@ def __repr__(self): class MXNetError(Exception): - """Error that will be thrown by all mxnet functions.""" + """Error that will be throwed by all mxnet functions.""" pass diff --git a/python/mxnet/library.py b/python/mxnet/library.py deleted file mode 100644 index 9ebf2c2bc580..000000000000 --- a/python/mxnet/library.py +++ /dev/null @@ -1,49 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# coding: utf-8 -"""Library management API of mxnet.""" -from __future__ import absolute_import -import ctypes -import os -from .base import _LIB, check_call, MXNetError - -def load(path): - """Loads library dynamically. - - Parameters - --------- - path : Path to library .so/.dll file - - Returns - --------- - void - """ - #check if path exists - if not os.path.exists(path): - raise MXNetError("load path %s does NOT exist" % path) - #check if path is an absolute path - if not os.path.isabs(path): - raise MXNetError("load path %s is not an absolute path" % path) - #check if path is to a library file - _, file_ext = os.path.splitext(path) - if not file_ext in ['.so', '.dll']: - raise MXNetError("load path %s is NOT a library file" % path) - - byt_obj = path.encode('utf-8') - chararr = ctypes.c_char_p(byt_obj) - check_call(_LIB.MXLoadLib(chararr)) diff --git a/src/c_api/c_api.cc b/src/c_api/c_api.cc index 5b23a8c694f6..5207bdfa444b 100644 --- a/src/c_api/c_api.cc +++ b/src/c_api/c_api.cc @@ -45,13 +45,11 @@ #include "mxnet/storage.h" #include "mxnet/libinfo.h" #include "mxnet/imperative.h" -#include "mxnet/lib_api.h" #include "./c_api_common.h" #include "../operator/custom/custom-inl.h" #include "../operator/tensor/matrix_op-inl.h" #include "../operator/tvmop/op_module.h" #include "../common/utils.h" -#include "../common/library.h" using namespace mxnet; @@ -92,19 +90,6 @@ inline int MXAPIGetFunctionRegInfo(const FunRegType *e, // NOTE: return value is added in API_END -// Loads library and initializes it -int MXLoadLib(const char *path) { - API_BEGIN(); - void *lib = load_lib(path); - if (!lib) - LOG(FATAL) << "Unable to load library"; - - initialize_t initialize = get_func(lib, const_cast(MXLIB_INITIALIZE_STR)); - if (!initialize(static_cast(MXNET_VERSION))) - LOG(FATAL) << "Library failed to initialize"; - API_END(); -} - int MXLibInfoFeatures(const struct LibFeature **lib_features, size_t *size) { using namespace features; API_BEGIN(); diff --git a/src/common/library.cc b/src/common/library.cc deleted file mode 100644 index 9e79b5dbe1bc..000000000000 --- a/src/common/library.cc +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/*! - * Copyright (c) 2015 by Contributors - * \file library.cc - * \brief Dynamically loading accelerator library - * and accessing its functions - */ - -#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) -#include -#else -#include -#endif - -#include -#include "library.h" - -#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) -/*! - * \brief Retrieve the system error message for the last-error code - * \param err string that gets the error message - */ -void win_err(char **err) { - uint32_t dw = GetLastError(); - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - dw, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - reinterpret_cast(err), - 0, NULL); -} -#endif - - -/*! - * \brief Loads the dynamic shared library file - * \param path library file location - * \return handle a pointer for the loaded library, nullptr if loading unsuccessful - */ -void* load_lib(const char* path) { - void *handle = nullptr; - std::string path_str(path); - // check if library was already loaded - if (loaded_libs.find(path_str) == loaded_libs.end()) { - // if not, load it -#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) - handle = LoadLibrary(path); - if (!handle) { - char *err_msg = nullptr; - win_err(&err_msg); - LOG(FATAL) << "Error loading library: '" << path << "'\n" << err_msg; - LocalFree(err_msg); - return nullptr; - } -#else - handle = dlopen(path, RTLD_LAZY); - if (!handle) { - LOG(FATAL) << "Error loading library: '" << path << "'\n" << dlerror(); - return nullptr; - } -#endif // _WIN32 or _WIN64 or __WINDOWS__ - // then store the pointer to the library - loaded_libs[path_str] = handle; - } else { - // otherwise just look up the pointer - handle = loaded_libs[path_str]; - } - return handle; -} - -/*! - * \brief Closes the loaded dynamic shared library file - * \param handle library file handle - */ -void close_lib(void* handle) { -#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) - FreeLibrary((HMODULE)handle); -#else - dlclose(handle); -#endif // _WIN32 or _WIN64 or __WINDOWS__ -} - -/*! - * \brief Obtains address of given function in the loaded library - * \param handle pointer for the loaded library - * \param func function pointer that gets output address - * \param name function name to be fetched - */ -void get_sym(void* handle, void** func, char* name) { -#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) - *func = GetProcAddress((HMODULE)handle, name); - if (!(*func)) { - char *err_msg = nullptr; - win_err(&err_msg); - LOG(FATAL) << "Error getting function '" << name << "' from library\n" << err_msg; - LocalFree(err_msg); - } -#else - *func = dlsym(handle, name); - if (!(*func)) { - LOG(FATAL) << "Error getting function '" << name << "' from library\n" << dlerror(); - } -#endif // _WIN32 or _WIN64 or __WINDOWS__ -} diff --git a/src/common/library.h b/src/common/library.h deleted file mode 100644 index d6eff4184191..000000000000 --- a/src/common/library.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/*! - * Copyright (c) 2015 by Contributors - * \file library.h - * \brief Defining library loading functions - */ -#ifndef MXNET_COMMON_LIBRARY_H_ -#define MXNET_COMMON_LIBRARY_H_ - -#include -#include -#include -#include "dmlc/io.h" - -// map of libraries loaded -static std::map loaded_libs; - -void* load_lib(const char* path); -void close_lib(void* handle); -void get_sym(void* handle, void** func, char* name); - -/*! - * \brief a templated function that fetches from the library - * a function pointer of any given datatype and name - * \param T a template parameter for data type of function pointer - * \param lib library handle - * \param func_name function name to search for in the library - * \return func a function pointer - */ -template -T get_func(void *lib, char *func_name) { - T func; - get_sym(lib, reinterpret_cast(&func), func_name); - if (!func) - LOG(FATAL) << "Unable to get function '" << func_name << "' from library"; - return func; -} - -#endif // MXNET_COMMON_LIBRARY_H_ diff --git a/src/engine/naive_engine.cc b/src/engine/naive_engine.cc index 371a6eb96303..92b38a8ea368 100644 --- a/src/engine/naive_engine.cc +++ b/src/engine/naive_engine.cc @@ -30,7 +30,6 @@ #include "./openmp.h" #include "../common/object_pool.h" #include "../profiler/custom_op_profiler.h" -#include "../../src/common/library.h" namespace mxnet { namespace engine { @@ -85,10 +84,6 @@ class NaiveEngine final : public Engine { } } #endif - // close opened libraries - for (auto const& lib : loaded_libs) { - close_lib(lib.second); - } } void Stop() override { diff --git a/src/engine/threaded_engine.h b/src/engine/threaded_engine.h index e9ced8898305..bf74485ba442 100644 --- a/src/engine/threaded_engine.h +++ b/src/engine/threaded_engine.h @@ -44,7 +44,6 @@ #include "./openmp.h" #include "../common/object_pool.h" #include "../profiler/custom_op_profiler.h" -#include "../../src/common/library.h" namespace mxnet { namespace engine { @@ -332,10 +331,6 @@ class ThreadedEngine : public Engine { kill_.store(true); } finished_cv_.notify_all(); - // close opened libraries - for (auto const& lib : loaded_libs) { - close_lib(lib.second); - } } protected: diff --git a/tests/python/gpu/test_operator_gpu.py b/tests/python/gpu/test_operator_gpu.py index a8aa1ff853f7..91ba9fb68750 100644 --- a/tests/python/gpu/test_operator_gpu.py +++ b/tests/python/gpu/test_operator_gpu.py @@ -45,7 +45,6 @@ from test_subgraph_op import * from test_contrib_operator import test_multibox_target_op from test_tvm_op import * -from test_library_loading import * set_default_context(mx.gpu(0)) del test_support_vector_machine_l1_svm # noqa diff --git a/tests/python/unittest/test_library_loading.py b/tests/python/unittest/test_library_loading.py deleted file mode 100644 index 3d56d0c750a6..000000000000 --- a/tests/python/unittest/test_library_loading.py +++ /dev/null @@ -1,38 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# This test checks if dynamic loading of library into MXNet is successful - -import os -import platform -import unittest -import mxnet as mx -from mxnet.test_utils import download - -def check_platform(): - return platform.machine() not in ['x86_64', 'AMD64'] - -@unittest.skipIf(check_platform(), "not all machine types supported") -def test_library_loading(): - if (os.name=='posix'): - lib = 'mylib.so' - elif (os.name=='nt'): - lib = 'mylib.dll' - - fname = mx.test_utils.download('https://mxnet-demo-models.s3.amazonaws.com/lib_binary/'+lib) - fname = os.path.abspath(fname) - mx.library.load(fname)