From fa7db8bf559dd78e42f34e5c60443c8c7486f174 Mon Sep 17 00:00:00 2001
From: Mathias Wagner <mathiasw@nvidia.com>
Date: Sat, 16 Nov 2019 09:55:34 -0700
Subject: [PATCH] more fixes to master notebook and more CMake

---
 4-GPU/HandsOn/.master/CMakeLists.txt          | 37 +++++++++++++++++--
 .../HandsOnGPUProgramming_master.ipynb        | 10 ++++-
 2 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/4-GPU/HandsOn/.master/CMakeLists.txt b/4-GPU/HandsOn/.master/CMakeLists.txt
index 9d0cfd4..50d0946 100644
--- a/4-GPU/HandsOn/.master/CMakeLists.txt
+++ b/4-GPU/HandsOn/.master/CMakeLists.txt
@@ -13,20 +13,51 @@ add_custom_command(OUTPUT HandsOnGPUProgramming.ipynb
         COMMAND jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace HandsOnGPUProgramming.ipynb
         DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/HandsOnGPUProgramming_master.ipynb) 
 
+add_custom_command(OUTPUT HandsOnGPUProgramming.html
+        COMMAND jupyter nbconvert --to html --output HandsOnGPUProgramming.html HandsOnGPUProgramming.ipynb
+        DEPENDS HandsOnGPUProgramming.ipynb 
+        )
+
+add_custom_command(OUTPUT HandsOnGPUProgramming.pdf
+        COMMAND jupyter nbconvert --to pdf --output HandsOnGPUProgramming.pdf HandsOnGPUProgramming.ipynb
+        DEPENDS HandsOnGPUProgramming.ipynb 
+        )
+
 add_custom_command(OUTPUT HandsOnGPUProgramming_Solution.ipynb 
         COMMAND notebook-splitter --remove "task" ${CMAKE_CURRENT_SOURCE_DIR}/HandsOnGPUProgramming_master.ipynb --output HandsOnGPUProgramming_Solution.ipynb 
         DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/HandsOnGPUProgramming_master.ipynb) 
 
+add_custom_command(OUTPUT HandsOnGPUProgramming_Solution.html
+        COMMAND jupyter nbconvert --to html --output HandsOnGPUProgramming_Solution.html HandsOnGPUProgramming_Solution.ipynb
+        DEPENDS HandsOnGPUProgramming_Solution.ipynb 
+        )
+
+add_custom_command(OUTPUT HandsOnGPUProgramming_Solution.pdf
+        COMMAND jupyter nbconvert --to pdf --output HandsOnGPUProgramming_Solution.pdf HandsOnGPUProgramming_Solution.ipynb
+        DEPENDS HandsOnGPUProgramming_Solution.ipynb 
+        )
+
 add_custom_target(notebook_task DEPENDS HandsOnGPUProgramming.ipynb)
+add_custom_target(notebook_task_html DEPENDS HandsOnGPUProgramming.html)
+add_custom_target(notebook_task_pdf DEPENDS HandsOnGPUProgramming.pdf)
 add_custom_target(notebook_solution DEPENDS HandsOnGPUProgramming_Solution.ipynb)
-add_custom_target(notebook ALL DEPENDS notebook_solution notebook_task)
+add_custom_target(notebook_solution_html DEPENDS HandsOnGPUProgramming_Solution.html)
+add_custom_target(notebook_solution_pdf DEPENDS HandsOnGPUProgramming_Solution.pdf)
+
+add_custom_target(notebook ALL DEPENDS notebook_solution notebook_solution_html notebook_task notebook_task_html)
 
 file(RELATIVE_PATH RELPATH ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
 set(SOLUTION_DIR ${CMAKE_SOURCE_DIR}/../Solution/${RELPATH})
 set(TASK_DIR ${CMAKE_SOURCE_DIR}/../${RELPATH})
 
-set(TASK_FILES ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming.ipynb)
-set(SOLUTION_FILES ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming_Solution.ipynb)
+set(TASK_FILES ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming.ipynb 
+               ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming.html
+ #              ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming.pdf
+)
+set(SOLUTION_FILES ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming_Solution.ipynb
+                   ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming_Solution.html
+#                   ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming_Solution.pdf
+ )
 
 message(VERBOSE "TASK FILES ${TASK_FILES} GO TO ${TASK_DIR}")
 message(VERBOSE "SOLUTION FILES ${SOLUTION_FILES} GO TO ${SOLUTION_DIR}")
diff --git a/4-GPU/HandsOn/.master/HandsOnGPUProgramming_master.ipynb b/4-GPU/HandsOn/.master/HandsOnGPUProgramming_master.ipynb
index 4e5bfe9..51108da 100644
--- a/4-GPU/HandsOn/.master/HandsOnGPUProgramming_master.ipynb
+++ b/4-GPU/HandsOn/.master/HandsOnGPUProgramming_master.ipynb
@@ -192,6 +192,8 @@
     "\n",
     "* [Task 5](#task5) Put NVSHMEM calls on stream to hide API calls and GPU/CPU synchronization  \n",
     "\n",
+    "* [Task 6](#task6) Use NVSHMEM to fine-grained also update the halo region of your neighbors  \n",
+    "\n",
     "\n",
     "### Survey\n",
     " \n",
@@ -1632,7 +1634,11 @@
     "---\n",
     "# Tasks using NVSHMEM \n",
     "\n",
-    "**The following tasks are using NVSHMEM instead of MPI. NVSHMEM is currently available as early access software. Please read the following carefully before starting these tasks.**\n",
+    "\n",
+    "**The following tasks are using NVSHMEM instead of MPI**. \n",
+    "**NVSHMEM is currently available as early access software.** \n",
+    "**Please read the following carefully before starting these tasks.**\n",
+    "\n",
     "\n",
     "* *NVSHMEM early access 0.3.2* is installed on Ascent. It is provided under the license in [LICENSE_NVSHMEM.md](./LICENSE_NVSHMEM.md).\n",
     "* If you want to continue using the NVHSMEM early access version beyond this tutorial you need to apply for early access at https://developer.nvidia.com/nvshmem\n",
@@ -2402,7 +2408,7 @@
     "exercise": "task"
    },
    "source": [
-    "## Task 6: <a name=\"task5\"></a>Use direct load/store to remote memory\n",
+    "## Task 6: <a name=\"task6\"></a>Use direct load/store to remote memory\n",
     "\n",
     "NVSHMEM allows you to put communications in the GPU kernels. However, the `nvhsmem_put / nvshmem_get` calls are not easily available in OpenACC kernels. However, for *intranode* communication when all GPUs can use P2P (as in the nodes in Ascent and Summit) you can get a pointer to a remote GPUs memory using `nvshmem_ptr`.\n",
     "\n",
-- 
GitLab