You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by sk...@apache.org on 2018/08/10 18:18:54 UTC
[incubator-mxnet] branch master updated: GPU Memory Query to C API
(#12083)
This is an automated email from the ASF dual-hosted git repository.
skm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
The following commit(s) were added to refs/heads/master by this push:
new 584c5c1 GPU Memory Query to C API (#12083)
584c5c1 is described below
commit 584c5c184be3073f2f2fad6dafe4689a625d676a
Author: Sebastian Bodenstein <se...@gmail.com>
AuthorDate: Fri Aug 10 20:18:46 2018 +0200
GPU Memory Query to C API (#12083)
* add support for GPU memory query
* remove lint
---
include/mxnet/base.h | 37 +++++++++++++++++++++++++++++++++++++
include/mxnet/c_api.h | 9 +++++++++
src/c_api/c_api.cc | 6 ++++++
3 files changed, 52 insertions(+)
diff --git a/include/mxnet/base.h b/include/mxnet/base.h
index a652fe5..75784a3 100644
--- a/include/mxnet/base.h
+++ b/include/mxnet/base.h
@@ -223,6 +223,14 @@ struct Context {
*/
inline static int32_t GetGPUCount();
/*!
+ * \brief get the free and total available memory on a GPU
+ * \param dev the GPU number to query
+ * \param free_mem pointer to the integer holding free GPU memory
+ * \param total_mem pointer to the integer holding total GPU memory
+ * \return No return value
+ */
+ inline static void GetGPUMemoryInformation(int dev, int *free, int *total);
+ /*!
* Create a pinned CPU context.
* \param dev_id the device id for corresponding GPU.
* \return Pinned CPU context. -1 for current GPU.
@@ -326,6 +334,35 @@ inline int32_t Context::GetGPUCount() {
#endif
}
+inline void Context::GetGPUMemoryInformation(int dev, int *free_mem,
+ int *total_mem) {
+#if MXNET_USE_CUDA
+
+ size_t memF, memT;
+ cudaError_t e;
+
+ int curDevice;
+ e = cudaGetDevice(&curDevice);
+ CHECK_EQ(e, cudaSuccess) << " CUDA: " << cudaGetErrorString(e);
+
+ e = cudaSetDevice(dev);
+ CHECK_EQ(e, cudaSuccess) << " CUDA: " << cudaGetErrorString(e);
+
+ e = cudaMemGetInfo(&memF, &memT);
+ CHECK_EQ(e, cudaSuccess) << " CUDA: " << cudaGetErrorString(e);
+
+ e = cudaSetDevice(curDevice);
+ CHECK_EQ(e, cudaSuccess) << " CUDA: " << cudaGetErrorString(e);
+
+ *free_mem = static_cast<int>(memF);
+ *total_mem = static_cast<int>(memT);
+
+#else
+ LOG(FATAL)
+ << "This call is only supported for MXNet built with CUDA support.";
+#endif
+}
+
inline Context Context::FromString(const std::string& str) {
Context ret;
try {
diff --git a/include/mxnet/c_api.h b/include/mxnet/c_api.h
index 43f8227..0043996 100644
--- a/include/mxnet/c_api.h
+++ b/include/mxnet/c_api.h
@@ -438,6 +438,15 @@ MXNET_DLL int MXEngineSetBulkSize(int bulk_size, int* prev_bulk_size);
MXNET_DLL int MXGetGPUCount(int* out);
/*!
+ * \brief get the free and total available memory on a GPU
+ * \param dev the GPU number to query
+ * \param free_mem pointer to the integer holding free GPU memory
+ * \param total_mem pointer to the integer holding total GPU memory
+ * \return 0 when success, -1 when failure happens
+ */
+MXNET_DLL int MXGetGPUMemoryInformation(int dev, int *free_mem, int *total_mem);
+
+/*!
* \brief get the MXNet library version as an integer
* \param pointer to the integer holding the version number
* \return 0 when success, -1 when failure happens
diff --git a/src/c_api/c_api.cc b/src/c_api/c_api.cc
index ed513c0..1ef3f0f 100644
--- a/src/c_api/c_api.cc
+++ b/src/c_api/c_api.cc
@@ -122,6 +122,12 @@ int MXGetGPUCount(int* out) {
API_END();
}
+int MXGetGPUMemoryInformation(int dev, int *free_mem, int *total_mem) {
+ API_BEGIN();
+ Context::GetGPUMemoryInformation(dev, free_mem, total_mem);
+ API_END();
+}
+
int MXGetVersion(int *out) {
API_BEGIN();
*out = static_cast<int>(MXNET_VERSION);