From 55ef33b96ae74abd0e623c29c678f8d7d81f41d6 Mon Sep 17 00:00:00 2001 From: mcbarton <150042563+mcbarton@users.noreply.github.com> Date: Tue, 24 Feb 2026 15:15:01 +0000 Subject: [PATCH 1/7] Modify the conda environment to add openmp library and resource directory --- environment-dev.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/environment-dev.yml b/environment-dev.yml index 05ca275b..d1818f76 100644 --- a/environment-dev.yml +++ b/environment-dev.yml @@ -5,7 +5,8 @@ dependencies: # Build dependencies - make - cmake - - cxx-compiler + - clangxx # [not win] + - cxx-compiler # [win] # Host dependencies - xeus>=6.0.0 - xeus-zmq @@ -14,6 +15,10 @@ dependencies: - CppInterOp>=1.8 - pugixml - cpp-argparse + - llvm-openmp + - curl + - libcurl + - libcurl-static # Test dependencies - pytest - jupyter_kernel_test<0.8 From a5fe22ef314849903d6d9f607f8f1d1038bb4c5c Mon Sep 17 00:00:00 2001 From: mcbarton <150042563+mcbarton@users.noreply.github.com> Date: Tue, 24 Feb 2026 15:15:54 +0000 Subject: [PATCH 2/7] Add OpenMP kernel configs --- share/jupyter/kernels/xc11-omp/kernel.json.in | 14 +++++++++ share/jupyter/kernels/xc11-omp/logo-32x32.png | Bin 0 -> 980 bytes share/jupyter/kernels/xc11-omp/logo-64x64.png | Bin 0 -> 1995 bytes share/jupyter/kernels/xc11-omp/logo-svg.svg | 28 ++++++++++++++++++ share/jupyter/kernels/xc11/kernel.json.in | 4 --- share/jupyter/kernels/xc17-omp/kernel.json.in | 14 +++++++++ share/jupyter/kernels/xc17-omp/logo-32x32.png | Bin 0 -> 980 bytes share/jupyter/kernels/xc17-omp/logo-64x64.png | Bin 0 -> 1995 bytes share/jupyter/kernels/xc17-omp/logo-svg.svg | 28 ++++++++++++++++++ share/jupyter/kernels/xc17/kernel.json.in | 4 --- share/jupyter/kernels/xc23-omp/kernel.json.in | 14 +++++++++ share/jupyter/kernels/xc23-omp/logo-32x32.png | Bin 0 -> 980 bytes share/jupyter/kernels/xc23-omp/logo-64x64.png | Bin 0 -> 1995 bytes share/jupyter/kernels/xc23-omp/logo-svg.svg | 28 ++++++++++++++++++ share/jupyter/kernels/xc23/kernel.json.in | 4 --- .../jupyter/kernels/xcpp17-omp/kernel.json.in | 8 ++--- share/jupyter/kernels/xcpp17/kernel.json.in | 6 +--- .../jupyter/kernels/xcpp20-omp/kernel.json.in | 14 +++++++++ .../jupyter/kernels/xcpp20-omp/logo-32x32.png | Bin 0 -> 1520 bytes .../jupyter/kernels/xcpp20-omp/logo-64x64.png | Bin 0 -> 3113 bytes share/jupyter/kernels/xcpp20-omp/logo-svg.svg | 25 ++++++++++++++++ share/jupyter/kernels/xcpp20/kernel.json.in | 6 +--- .../jupyter/kernels/xcpp23-omp/kernel.json.in | 14 +++++++++ .../jupyter/kernels/xcpp23-omp/logo-32x32.png | Bin 0 -> 1520 bytes .../jupyter/kernels/xcpp23-omp/logo-64x64.png | Bin 0 -> 3113 bytes share/jupyter/kernels/xcpp23-omp/logo-svg.svg | 25 ++++++++++++++++ share/jupyter/kernels/xcpp23/kernel.json.in | 6 +--- 27 files changed, 209 insertions(+), 33 deletions(-) create mode 100644 share/jupyter/kernels/xc11-omp/kernel.json.in create mode 100644 share/jupyter/kernels/xc11-omp/logo-32x32.png create mode 100644 share/jupyter/kernels/xc11-omp/logo-64x64.png create mode 100644 share/jupyter/kernels/xc11-omp/logo-svg.svg create mode 100644 share/jupyter/kernels/xc17-omp/kernel.json.in create mode 100644 share/jupyter/kernels/xc17-omp/logo-32x32.png create mode 100644 share/jupyter/kernels/xc17-omp/logo-64x64.png create mode 100644 share/jupyter/kernels/xc17-omp/logo-svg.svg create mode 100644 share/jupyter/kernels/xc23-omp/kernel.json.in create mode 100644 share/jupyter/kernels/xc23-omp/logo-32x32.png create mode 100644 share/jupyter/kernels/xc23-omp/logo-64x64.png create mode 100644 share/jupyter/kernels/xc23-omp/logo-svg.svg create mode 100644 share/jupyter/kernels/xcpp20-omp/kernel.json.in create mode 100644 share/jupyter/kernels/xcpp20-omp/logo-32x32.png create mode 100644 share/jupyter/kernels/xcpp20-omp/logo-64x64.png create mode 100644 share/jupyter/kernels/xcpp20-omp/logo-svg.svg create mode 100644 share/jupyter/kernels/xcpp23-omp/kernel.json.in create mode 100644 share/jupyter/kernels/xcpp23-omp/logo-32x32.png create mode 100644 share/jupyter/kernels/xcpp23-omp/logo-64x64.png create mode 100644 share/jupyter/kernels/xcpp23-omp/logo-svg.svg diff --git a/share/jupyter/kernels/xc11-omp/kernel.json.in b/share/jupyter/kernels/xc11-omp/kernel.json.in new file mode 100644 index 00000000..e968cce8 --- /dev/null +++ b/share/jupyter/kernels/xc11-omp/kernel.json.in @@ -0,0 +1,14 @@ +{ + "display_name": "C11 + OpenMP", + "argv": [ + "@XEUS_CPP_KERNELSPEC_PATH@xcpp", + "-f", + "{connection_file}", + "-resource-dir", "@XEUS_CPP_RESOURCE_DIR@","-xc", + "-I", "@XEUS_CPP_INCLUDE_DIR@", + "-std=c11","@XEUS_CPP_OMP@" + ], + "language": "c", + "metadata": {"debugger": false + } +} diff --git a/share/jupyter/kernels/xc11-omp/logo-32x32.png b/share/jupyter/kernels/xc11-omp/logo-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..298cf7fdb2946f05215b28a5241cde3e554bf99c GIT binary patch literal 980 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 literal 0 HcmV?d00001 diff --git a/share/jupyter/kernels/xc11-omp/logo-svg.svg b/share/jupyter/kernels/xc11-omp/logo-svg.svg new file mode 100644 index 00000000..8391ccaa --- /dev/null +++ b/share/jupyter/kernels/xc11-omp/logo-svg.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/share/jupyter/kernels/xc11/kernel.json.in b/share/jupyter/kernels/xc11/kernel.json.in index cc80f89e..3191de35 100644 --- a/share/jupyter/kernels/xc11/kernel.json.in +++ b/share/jupyter/kernels/xc11/kernel.json.in @@ -1,9 +1,5 @@ { "display_name": "C11", - "env": { - "PATH":"@XEUS_CPP_PATH@", - "LD_LIBRARY_PATH":"@XEUS_CPP_LD_LIBRARY_PATH@" - }, "argv": [ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-f", diff --git a/share/jupyter/kernels/xc17-omp/kernel.json.in b/share/jupyter/kernels/xc17-omp/kernel.json.in new file mode 100644 index 00000000..c5ae6b8b --- /dev/null +++ b/share/jupyter/kernels/xc17-omp/kernel.json.in @@ -0,0 +1,14 @@ +{ + "display_name": "C17 + OpenMP", + "argv": [ + "@XEUS_CPP_KERNELSPEC_PATH@xcpp", + "-f", + "{connection_file}", + "-resource-dir", "@XEUS_CPP_RESOURCE_DIR@","-xc", + "-I", "@XEUS_CPP_INCLUDE_DIR@", + "-std=c17","@XEUS_CPP_OMP@" + ], + "language": "c", + "metadata": {"debugger": false + } +} diff --git a/share/jupyter/kernels/xc17-omp/logo-32x32.png b/share/jupyter/kernels/xc17-omp/logo-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..298cf7fdb2946f05215b28a5241cde3e554bf99c GIT binary patch literal 980 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 literal 0 HcmV?d00001 diff --git a/share/jupyter/kernels/xc17-omp/logo-svg.svg b/share/jupyter/kernels/xc17-omp/logo-svg.svg new file mode 100644 index 00000000..8391ccaa --- /dev/null +++ b/share/jupyter/kernels/xc17-omp/logo-svg.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/share/jupyter/kernels/xc17/kernel.json.in b/share/jupyter/kernels/xc17/kernel.json.in index ce5f12fc..56b8e36e 100644 --- a/share/jupyter/kernels/xc17/kernel.json.in +++ b/share/jupyter/kernels/xc17/kernel.json.in @@ -1,9 +1,5 @@ { "display_name": "C17", - "env": { - "PATH":"@XEUS_CPP_PATH@", - "LD_LIBRARY_PATH":"@XEUS_CPP_LD_LIBRARY_PATH@" - }, "argv": [ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-f", diff --git a/share/jupyter/kernels/xc23-omp/kernel.json.in b/share/jupyter/kernels/xc23-omp/kernel.json.in new file mode 100644 index 00000000..60751766 --- /dev/null +++ b/share/jupyter/kernels/xc23-omp/kernel.json.in @@ -0,0 +1,14 @@ +{ + "display_name": "C23 + OpenMP", + "argv": [ + "@XEUS_CPP_KERNELSPEC_PATH@xcpp", + "-f", + "{connection_file}", + "-resource-dir", "@XEUS_CPP_RESOURCE_DIR@","-xc", + "-I", "@XEUS_CPP_INCLUDE_DIR@", + "-std=c23","@XEUS_CPP_OMP@" + ], + "language": "c", + "metadata": {"debugger": false + } +} diff --git a/share/jupyter/kernels/xc23-omp/logo-32x32.png b/share/jupyter/kernels/xc23-omp/logo-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..298cf7fdb2946f05215b28a5241cde3e554bf99c GIT binary patch literal 980 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 literal 0 HcmV?d00001 diff --git a/share/jupyter/kernels/xc23-omp/logo-svg.svg b/share/jupyter/kernels/xc23-omp/logo-svg.svg new file mode 100644 index 00000000..8391ccaa --- /dev/null +++ b/share/jupyter/kernels/xc23-omp/logo-svg.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/share/jupyter/kernels/xc23/kernel.json.in b/share/jupyter/kernels/xc23/kernel.json.in index 539d0041..adc504a6 100644 --- a/share/jupyter/kernels/xc23/kernel.json.in +++ b/share/jupyter/kernels/xc23/kernel.json.in @@ -1,9 +1,5 @@ { "display_name": "C23", - "env": { - "PATH":"@XEUS_CPP_PATH@", - "LD_LIBRARY_PATH":"@XEUS_CPP_LD_LIBRARY_PATH@" - }, "argv": [ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-f", diff --git a/share/jupyter/kernels/xcpp17-omp/kernel.json.in b/share/jupyter/kernels/xcpp17-omp/kernel.json.in index f74379f1..23421755 100644 --- a/share/jupyter/kernels/xcpp17-omp/kernel.json.in +++ b/share/jupyter/kernels/xcpp17-omp/kernel.json.in @@ -1,16 +1,12 @@ { - "display_name": "C++17 (xcpp+OpenMP)", - "env": { - "PATH":"@XEUS_CPP_PATH@", - "LD_LIBRARY_PATH":"@XEUS_CPP_LD_LIBRARY_PATH@" - }, + "display_name": "C++17 + OpenMP", "argv": [ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-f", "{connection_file}", "-resource-dir", "@XEUS_CPP_RESOURCE_DIR@", "-I", "@XEUS_CPP_INCLUDE_DIR@", - "-std=c++17"@XEUS_CPP_OMP@ + "-std=c++17","@XEUS_CPP_OMP@","-D_LIBCPP_DISABLE_AVAILABILITY" ], "language": "cpp", "metadata": {"debugger": false diff --git a/share/jupyter/kernels/xcpp17/kernel.json.in b/share/jupyter/kernels/xcpp17/kernel.json.in index a7d860f0..1e9b6991 100644 --- a/share/jupyter/kernels/xcpp17/kernel.json.in +++ b/share/jupyter/kernels/xcpp17/kernel.json.in @@ -1,16 +1,12 @@ { "display_name": "C++17", - "env": { - "PATH":"@XEUS_CPP_PATH@", - "LD_LIBRARY_PATH":"@XEUS_CPP_LD_LIBRARY_PATH@" - }, "argv": [ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-f", "{connection_file}", "-resource-dir", "@XEUS_CPP_RESOURCE_DIR@", "-I", "@XEUS_CPP_INCLUDE_DIR@", - "-std=c++17" + "-std=c++17","-D_LIBCPP_DISABLE_AVAILABILITY" ], "language": "cpp", "kernel_protocol_version": "5.6.0", diff --git a/share/jupyter/kernels/xcpp20-omp/kernel.json.in b/share/jupyter/kernels/xcpp20-omp/kernel.json.in new file mode 100644 index 00000000..a43c184f --- /dev/null +++ b/share/jupyter/kernels/xcpp20-omp/kernel.json.in @@ -0,0 +1,14 @@ +{ + "display_name": "C++20 + OpenMP", + "argv": [ + "@XEUS_CPP_KERNELSPEC_PATH@xcpp", + "-f", + "{connection_file}", + "-resource-dir", "@XEUS_CPP_RESOURCE_DIR@", + "-I", "@XEUS_CPP_INCLUDE_DIR@", + "-std=c++20","@XEUS_CPP_OMP@","-D_LIBCPP_DISABLE_AVAILABILITY" + ], + "language": "cpp", + "metadata": {"debugger": false + } +} diff --git a/share/jupyter/kernels/xcpp20-omp/logo-32x32.png b/share/jupyter/kernels/xcpp20-omp/logo-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c09c458544bb83b9e3ff4d38f5758bda10ceebe8 GIT binary patch literal 1520 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 + + + + + + + + + + + + + + + + diff --git a/share/jupyter/kernels/xcpp20/kernel.json.in b/share/jupyter/kernels/xcpp20/kernel.json.in index 15cef25d..ca81bfa8 100644 --- a/share/jupyter/kernels/xcpp20/kernel.json.in +++ b/share/jupyter/kernels/xcpp20/kernel.json.in @@ -1,16 +1,12 @@ { "display_name": "C++20", - "env": { - "PATH":"@XEUS_CPP_PATH@", - "LD_LIBRARY_PATH":"@XEUS_CPP_LD_LIBRARY_PATH@" - }, "argv": [ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-f", "{connection_file}", "-resource-dir", "@XEUS_CPP_RESOURCE_DIR@", "-I", "@XEUS_CPP_INCLUDE_DIR@", - "-std=c++20" + "-std=c++20","-D_LIBCPP_DISABLE_AVAILABILITY" ], "language": "cpp", "kernel_protocol_version": "5.6.0", diff --git a/share/jupyter/kernels/xcpp23-omp/kernel.json.in b/share/jupyter/kernels/xcpp23-omp/kernel.json.in new file mode 100644 index 00000000..0e76e032 --- /dev/null +++ b/share/jupyter/kernels/xcpp23-omp/kernel.json.in @@ -0,0 +1,14 @@ +{ + "display_name": "C++23 + OpenMP", + "argv": [ + "@XEUS_CPP_KERNELSPEC_PATH@xcpp", + "-f", + "{connection_file}", + "-resource-dir", "@XEUS_CPP_RESOURCE_DIR@", + "-I", "@XEUS_CPP_INCLUDE_DIR@", + "-std=c++23","@XEUS_CPP_OMP@","-D_LIBCPP_DISABLE_AVAILABILITY" + ], + "language": "cpp", + "metadata": {"debugger": false + } +} diff --git a/share/jupyter/kernels/xcpp23-omp/logo-32x32.png b/share/jupyter/kernels/xcpp23-omp/logo-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c09c458544bb83b9e3ff4d38f5758bda10ceebe8 GIT binary patch literal 1520 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 + + + + + + + + + + + + + + + + diff --git a/share/jupyter/kernels/xcpp23/kernel.json.in b/share/jupyter/kernels/xcpp23/kernel.json.in index 1a1a152a..88b3f630 100644 --- a/share/jupyter/kernels/xcpp23/kernel.json.in +++ b/share/jupyter/kernels/xcpp23/kernel.json.in @@ -1,16 +1,12 @@ { "display_name": "C++23", - "env": { - "PATH":"@XEUS_CPP_PATH@", - "LD_LIBRARY_PATH":"@XEUS_CPP_LD_LIBRARY_PATH@" - }, "argv": [ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-f", "{connection_file}", "-resource-dir", "@XEUS_CPP_RESOURCE_DIR@", "-I", "@XEUS_CPP_INCLUDE_DIR@", - "-std=c++23"@XEUS_CPP_OMP@ + "-std=c++23","-D_LIBCPP_DISABLE_AVAILABILITY" ], "language": "cpp", "kernel_protocol_version": "5.6.0", From 21487758ff4f1cd54d53ef2921ff69a73aee0a85 Mon Sep 17 00:00:00 2001 From: mcbarton <150042563+mcbarton@users.noreply.github.com> Date: Tue, 24 Feb 2026 15:16:07 +0000 Subject: [PATCH 3/7] Configure kernels in cmake --- CMakeLists.txt | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d885dd1..ca2b9d78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,6 +107,7 @@ endif() find_package(argparse REQUIRED) find_package(pugixml REQUIRED) +find_package(OpenMP) # Configuration # ============= @@ -128,14 +129,13 @@ function(configure_kernel kernel) string(APPEND XEUS_CPP_WASM_KERNEL_EXTRA_ARGS_JSON "\"${arg}\", ") endforeach() else() - set(XEUS_CPP_PATH "$ENV{PATH}") - set(XEUS_CPP_LD_LIBRARY_PATH "$ENV{LD_LIBRARY_PATH}") set(XEUS_CPP_INCLUDE_DIR ${CMAKE_INSTALL_PREFIX}/include) + if(${kernel} MATCHES "omp/$") + set(XEUS_CPP_OMP "${OpenMP_CXX_FLAGS}") + endif() endif() if (WIN32) string(REPLACE "\\" "/" kernel "${kernel}") - string(REPLACE "\\" "/" XEUS_CPP_PATH "${XEUS_CPP_PATH}") - string(REPLACE "\\" "/" XEUS_CPP_LD_LIBRARY_PATH "${XEUS_CPP_LD_LIBRARY_PATH}") string(REPLACE "\\" "/" XEUS_CPP_RESOURCE_DIR "${XEUS_CPP_RESOURCE_DIR}") string(REPLACE "\\" "/" XEUS_CPP_INCLUDE_DIR "${XEUS_CPP_INCLUDE_DIR}") endif() @@ -167,6 +167,14 @@ configure_kernel("/share/jupyter/kernels/xcpp23/") configure_kernel("/share/jupyter/kernels/xc11/") configure_kernel("/share/jupyter/kernels/xc17/") configure_kernel("/share/jupyter/kernels/xc23/") +if(NOT EMSCRIPTEN) + configure_kernel("/share/jupyter/kernels/xcpp17-omp/") + configure_kernel("/share/jupyter/kernels/xcpp20-omp/") + configure_kernel("/share/jupyter/kernels/xcpp23-omp/") + configure_kernel("/share/jupyter/kernels/xc11-omp/") + configure_kernel("/share/jupyter/kernels/xc17-omp/") + configure_kernel("/share/jupyter/kernels/xc23-omp/") +endif() # Source files # ============ @@ -339,8 +347,21 @@ macro(xeus_cpp_create_target target_name linkage output_name) target_compile_options(${target_name} PRIVATE "/MD$<$:d>") endif() elseif (NOT EMSCRIPTEN) + find_package(CURL REQUIRED) + + # Add CURL_STATICLIB definition if linking statically + if (CURL_STATICLIB) + target_compile_definitions(${target_name} PUBLIC CURL_STATICLIB) + endif() + + # Link against the correct libcurl target + if (CURL_FOUND) + target_include_directories(${target_name} PRIVATE ${CURL_INCLUDE_DIRS}) + target_link_libraries(${target_name} PRIVATE ${CURL_LIBRARIES}) + endif() + # Curl initialised specifically for xassist - target_link_libraries(${target_name} PUBLIC ${XEUS_CPP_XEUS_TARGET} clangCppInterOp pugixml argparse::argparse curl) + target_link_libraries(${target_name} PUBLIC ${XEUS_CPP_XEUS_TARGET} clangCppInterOp pugixml argparse::argparse CURL::libcurl) else () target_link_libraries(${target_name} PUBLIC ${XEUS_CPP_XEUS_TARGET} clangCppInterOp pugixml argparse::argparse) endif() From 116bbb2ee5c9dd15c53f571f950aa39a7f3f40dc Mon Sep 17 00:00:00 2001 From: mcbarton <150042563+mcbarton@users.noreply.github.com> Date: Tue, 24 Feb 2026 15:17:02 +0000 Subject: [PATCH 4/7] Load libomp library automatically if -fopenmp used --- src/xinterpreter.cpp | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/xinterpreter.cpp b/src/xinterpreter.cpp index 95990109..b78136e3 100644 --- a/src/xinterpreter.cpp +++ b/src/xinterpreter.cpp @@ -18,6 +18,8 @@ #include "xinput.hpp" #include "xinspect.hpp" #include "xmagics/os.hpp" +#include +#include #include #ifndef __EMSCRIPTEN__ #include "xmagics/xassist.hpp" @@ -29,15 +31,19 @@ using Args = std::vector; void* createInterpreter(const Args &ExtraArgs = {}) { Args ClangArgs = {/*"-xc++"*/"-v"}; + std::string resource_dir; if (std::find_if(ExtraArgs.begin(), ExtraArgs.end(), [](const std::string& s) { return s == "-resource-dir";}) == ExtraArgs.end()) { - std::string resource_dir = Cpp::DetectResourceDir(); - if (!resource_dir.empty()) { - ClangArgs.push_back("-resource-dir"); - ClangArgs.push_back(resource_dir.c_str()); - } else { - std::cerr << "Failed to detect the resource-dir\n"; - } + resource_dir = Cpp::DetectResourceDir(); + if (!resource_dir.empty()) + { + ClangArgs.push_back("-resource-dir"); + ClangArgs.push_back(resource_dir.c_str()); + } + else + { + std::cerr << "Failed to detect the resource-dir\n"; + } } std::vector CxxSystemIncludes; Cpp::DetectSystemCompilerIncludePaths(CxxSystemIncludes); @@ -48,7 +54,27 @@ void* createInterpreter(const Args &ExtraArgs = {}) { ClangArgs.insert(ClangArgs.end(), ExtraArgs.begin(), ExtraArgs.end()); // FIXME: We should process the kernel input options and conditionally pass // the gpu args here. - return Cpp::CreateInterpreter(ClangArgs/*, {"-cuda"}*/); + Cpp::TInterp_t res = Cpp::CreateInterpreter(ClangArgs /*, {"-cuda"}*/); + if (!res) + { + return res; + } + + // clang-repl does not load libomp.so when -fopenmp flag is used + // we need to explicitly load it + if (std::find_if( + ClangArgs.begin(), + ClangArgs.end(), + [](const std::string& s) + { + return s.find("-fopenmp") == 0; + } + ) + != ClangArgs.end()) + { + Cpp::LoadLibrary("libomp"); + } + return res; } using namespace std::placeholders; From 0c1a3437726174df98fc303d63a0fe489ec16f93 Mon Sep 17 00:00:00 2001 From: mcbarton <150042563+mcbarton@users.noreply.github.com> Date: Tue, 24 Feb 2026 15:17:29 +0000 Subject: [PATCH 5/7] Add example notebooks --- notebooks/openmp-notebooks/hello_world.ipynb | 81 +++++++ notebooks/openmp-notebooks/linked_list.ipynb | 223 +++++++++++++++++++ notebooks/openmp-notebooks/mandel.ipynb | 133 +++++++++++ notebooks/openmp-notebooks/openmp-demo.ipynb | 220 ++++++++++++++++++ notebooks/openmp-notebooks/pi_integral.ipynb | 110 +++++++++ 5 files changed, 767 insertions(+) create mode 100644 notebooks/openmp-notebooks/hello_world.ipynb create mode 100644 notebooks/openmp-notebooks/linked_list.ipynb create mode 100644 notebooks/openmp-notebooks/mandel.ipynb create mode 100644 notebooks/openmp-notebooks/openmp-demo.ipynb create mode 100644 notebooks/openmp-notebooks/pi_integral.ipynb diff --git a/notebooks/openmp-notebooks/hello_world.ipynb b/notebooks/openmp-notebooks/hello_world.ipynb new file mode 100644 index 00000000..9479f962 --- /dev/null +++ b/notebooks/openmp-notebooks/hello_world.ipynb @@ -0,0 +1,81 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "73cbab37-71dd-477d-981b-f2ec28c01bd6", + "metadata": {}, + "outputs": [], + "source": [ + "#include \n", + "#include " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "c2b754ad-9553-4a42-b990-f990a9a269ed", + "metadata": {}, + "outputs": [], + "source": [ + "int main() {\n", + " int max_threads = omp_get_max_threads();\n", + "\n", + " printf(\"max threads: %d\\n\", max_threads);\n", + " omp_set_num_threads(max_threads);\n", + "\n", + "#pragma omp parallel\n", + " {\n", + " int id = omp_get_thread_num();\n", + " printf(\"Hello World from thread = %d with %d threads\\n\", id, omp_get_num_threads());\n", + " }\n", + "\n", + " printf(\"all done, with hopefully %d threads\\n\", max_threads);\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a37a13d4-fc82-496e-8f42-9e718a8c2aa0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "max threads: 8\n", + "Hello World from thread = 0 with 8 threads\n", + "Hello World from thread = 3 with 8 threads\n", + "Hello World from thread = 4 with 8 threads\n", + "Hello World from thread = 2 with 8 threads\n", + "Hello World from thread = 7 with 8 threads\n", + "Hello World from thread = 1 with 8 threads\n", + "Hello World from thread = 6 with 8 threads\n", + "Hello World from thread = 5 with 8 threads\n", + "all done, with hopefully 8 threads\n" + ] + } + ], + "source": [ + "main();" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "C++17 (xcpp+OpenMP)", + "language": "cpp", + "name": "xcpp17-omp" + }, + "language_info": { + "codemirror_mode": "text/x-c++src", + "file_extension": ".cpp", + "mimetype": "text/x-c++src", + "name": "C++", + "version": "17" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/openmp-notebooks/linked_list.ipynb b/notebooks/openmp-notebooks/linked_list.ipynb new file mode 100644 index 00000000..2f5574d1 --- /dev/null +++ b/notebooks/openmp-notebooks/linked_list.ipynb @@ -0,0 +1,223 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "156447d2-9279-45a0-890b-4e519d2c796b", + "metadata": {}, + "outputs": [], + "source": [ + "#include \n", + "#include \n", + "#include " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c96fdeb0-817d-48c0-af8e-20a52947d60b", + "metadata": {}, + "outputs": [], + "source": [ + "#ifndef N\n", + "#define N 5\n", + "#endif\n", + "#ifndef FS\n", + "#define FS 38\n", + "#endif" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "22f97c49-78d1-496e-ac7c-978aed95331a", + "metadata": {}, + "outputs": [], + "source": [ + "struct node {\n", + " int data;\n", + " int fibdata;\n", + " struct node *next;\n", + "};" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "b16b1e8a-8831-4b8d-9d57-09deeaaa88ee", + "metadata": {}, + "outputs": [], + "source": [ + "struct node *init_list(struct node *p);\n", + "void processwork(struct node *p);\n", + "int fib(int n);" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0ef8af6c-1d6f-4c68-84bc-3dd1d8092b06", + "metadata": {}, + "outputs": [], + "source": [ + "int fib(int n) {\n", + " int x, y;\n", + " if (n < 2) {\n", + " return (n);\n", + " } else {\n", + " x = fib(n - 1);\n", + " y = fib(n - 2);\n", + " return (x + y);\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "1fa0307d-fdc9-4503-95cb-1c6448791354", + "metadata": {}, + "outputs": [], + "source": [ + "void processwork(struct node *p) {\n", + " int n, temp;\n", + " n = p->data;\n", + " temp = fib(n);\n", + "\n", + " p->fibdata = temp;\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "03acb599-9329-49ff-8aff-c0902adb6c3c", + "metadata": {}, + "outputs": [], + "source": [ + "struct node *init_list(struct node *p) {\n", + " int i;\n", + " struct node *head = NULL;\n", + " struct node *temp = NULL;\n", + "\n", + " head = (struct node*) malloc(sizeof(struct node));\n", + " p = head;\n", + " p->data = FS;\n", + " p->fibdata = 0;\n", + " for (i = 0; i < N; i++) {\n", + " temp = (struct node*) malloc(sizeof(struct node));\n", + " p->next = temp;\n", + " p = temp;\n", + " p->data = FS + i + 1;\n", + " p->fibdata = i + 1;\n", + " }\n", + "\n", + " p->next = NULL;\n", + " return head;\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f2dfb41b-e55f-43c0-b7f6-546a1697acb1", + "metadata": {}, + "outputs": [], + "source": [ + "int main() {\n", + " double start, end;\n", + " struct node *p = NULL;\n", + " struct node *temp = NULL;\n", + " struct node *head = NULL;\n", + "\n", + " printf(\"Process linked list\\n\");\n", + " printf(\" Each linked list node will be processed by function 'processwork()'\\n\");\n", + " printf(\" Each ll node will compute %d fibonacci numbers beginning with %d\\n\", N, FS);\n", + "\n", + " omp_set_num_threads(omp_get_max_threads());\n", + "\n", + " p = init_list(p);\n", + " head = p;\n", + "\n", + " start = omp_get_wtime();\n", + "\n", + "#pragma omp parallel\n", + " {\n", + "#pragma omp master\n", + " printf(\"Threads: %d\\n\", omp_get_num_threads());\n", + "\n", + "#pragma omp single\n", + " {\n", + " p = head;\n", + " while (p) {\n", + "#pragma omp task firstprivate(p) // first private is required\n", + " {\n", + " processwork(p);\n", + " }\n", + " p = p->next;\n", + " }\n", + " }\n", + " }\n", + "\n", + " end = omp_get_wtime();\n", + " p = head;\n", + " while (p != NULL) {\n", + " printf(\"%d : %d\\n\", p->data, p->fibdata);\n", + " temp = p->next;\n", + " free(p);\n", + " p = temp;\n", + " }\n", + "\n", + " free(p);\n", + " printf(\"Compute Time: %f seconds\\n\", end - start);\n", + "\n", + " return 0;\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "353e5dfd-fcae-43e6-97e3-ec98070811a1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process linked list\n", + " Each linked list node will be processed by function 'processwork()'\n", + " Each ll node will compute 5 fibonacci numbers beginning with 38\n", + "Threads: 8\n", + "38 : 39088169\n", + "39 : 63245986\n", + "40 : 102334155\n", + "41 : 165580141\n", + "42 : 267914296\n", + "43 : 433494437\n", + "Compute Time: 2.617225 seconds\n" + ] + } + ], + "source": [ + "main();" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "C++17 (xcpp+OpenMP)", + "language": "cpp", + "name": "xcpp17-omp" + }, + "language_info": { + "codemirror_mode": "text/x-c++src", + "file_extension": ".cpp", + "mimetype": "text/x-c++src", + "name": "C++", + "version": "17" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/openmp-notebooks/mandel.ipynb b/notebooks/openmp-notebooks/mandel.ipynb new file mode 100644 index 00000000..2d302a05 --- /dev/null +++ b/notebooks/openmp-notebooks/mandel.ipynb @@ -0,0 +1,133 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "5059dbdd-821d-498a-8716-eb0fcf8a8f5f", + "metadata": {}, + "outputs": [], + "source": [ + "#include \n", + "#include \n", + "#include \n", + "#include " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "8b66f96a-14ef-4f23-8024-bcfc42b31e4e", + "metadata": {}, + "outputs": [], + "source": [ + "#define NPOINTS 1000\n", + "#define MAXITER 1000" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d89dd57c-fe19-4233-a33a-df9b24fae98a", + "metadata": {}, + "outputs": [], + "source": [ + "int numoutside = 0;" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5c35c479-2f79-46b7-bc66-24be6b1694e0", + "metadata": {}, + "outputs": [], + "source": [ + "void testpoint(double creal, double cimag) {\n", + " // iterate z=z*z+c, until |z| > 2 when point is known to be outside set\n", + " // If loop count reaches MAXITER, point is considered to be inside the set\n", + "\n", + " double zreal, zimag, temp;\n", + " int iter;\n", + " zreal = creal;\n", + " zimag = cimag;\n", + "\n", + " for (iter = 0; iter < MAXITER; iter++) {\n", + " temp = (zreal * zreal) - (zimag * zimag) + creal;\n", + " zimag = zreal * zimag * 2 + cimag;\n", + " zreal = temp;\n", + " if ((zreal * zreal + zimag * zimag) > 4.0) {\n", + " numoutside++;\n", + " break;\n", + " }\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ea116fef-7d05-4e29-97a1-55c85c7241d8", + "metadata": {}, + "outputs": [], + "source": [ + "int main() {\n", + " int i, j;\n", + " double area, error, eps = 1.0e-5;\n", + " double cimag, creal;\n", + " // Loop over grid of points in the complex plane which contains the Mandelbrot set,\n", + " // testing each point to see whether it is inside or outside the set.\n", + "\n", + "#pragma omp parallel for private(eps)\n", + " for (i = 0; i < NPOINTS; i++) {\n", + " for (j = 0; j < NPOINTS; j++) {\n", + " creal = -2.0 + 2.5 * (double) (i) / (double) (NPOINTS) + eps;\n", + " cimag = 1.125 * (double) (j) / (double) (NPOINTS) + eps;\n", + " testpoint(creal, cimag);\n", + " }\n", + " }\n", + "\n", + " // Calculate area of set and error estimate and output the results\n", + " area = 2.0 * 2.5 * 1.125 * (double) (NPOINTS * NPOINTS - numoutside) / (double) (NPOINTS * NPOINTS);\n", + " error = area / (double) NPOINTS;\n", + "\n", + " printf(\"Area of Mandlebrot set = %12.8f +/- %12.8f\\n\", area, error);\n", + " printf(\"Correct answer should be around 1.510659\\n\");\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "39cf129c-8106-4e67-a2f1-1a7fff17cd38", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Area of Mandlebrot set = 3.80247750 +/- 0.00380248\n", + "Correct answer should be around 1.510659\n" + ] + } + ], + "source": [ + "main();" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "C++17 (xcpp+OpenMP)", + "language": "cpp", + "name": "xcpp17-omp" + }, + "language_info": { + "codemirror_mode": "text/x-c++src", + "file_extension": ".cpp", + "mimetype": "text/x-c++src", + "name": "C++", + "version": "17" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/openmp-notebooks/openmp-demo.ipynb b/notebooks/openmp-notebooks/openmp-demo.ipynb new file mode 100644 index 00000000..9705a587 --- /dev/null +++ b/notebooks/openmp-notebooks/openmp-demo.ipynb @@ -0,0 +1,220 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "b0c15570-ee24-42ed-b61f-11a3fc858b2d", + "metadata": {}, + "outputs": [], + "source": [ + "#include \n", + "#include " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5001e441-1fa5-4bdc-9fa5-2ca103ae484f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello World!\n" + ] + } + ], + "source": [ + "void example1() {\n", + " std::cout << \"Hello World!\" << std::endl;\n", + "}\n", + "example1();" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "53fb7656-b72e-42bc-ade7-2ae2077142da", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello World!Hello World!\n", + "Hello World!Hello World!\n", + "Hello World!\n", + "\n", + "Hello World!\n", + "\n", + "Hello World!\n", + "Hello World!\n" + ] + } + ], + "source": [ + "void example2() {\n", + " #pragma omp parallel\n", + " {\n", + " std::cout << \"Hello World!\" << std::endl;\n", + " }\n", + "}\n", + "example2();" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "efcdfdb6-a60b-46af-8194-75ef9cc0e27f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello World! (Hello World! (Hello World! (Hello World! (34)\n", + "Hello World! (7)\n", + "0)\n", + "2Hello World! (6))\n", + "\n", + ")\n", + "Hello World! (5)\n", + "Hello World! (1)\n" + ] + } + ], + "source": [ + "void example3() {\n", + " #pragma omp parallel\n", + " {\n", + " std::cout << \"Hello World! (\" << omp_get_thread_num() << \")\" << std::endl;\n", + " }\n", + "}\n", + "example3();" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d86a9efa-ba28-4cb6-bbfc-abc00ee63506", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello World! (Hello World! (34))\n", + "Hello World! (0)\n", + "Hello World! (2)\n", + "Hello World! (Hello World! (1)\n", + "\n", + "7)Hello World! (\n", + "6)\n", + "Hello World! (5)\n", + "This is another message! (0)\n", + "Goodbye World! (0)\n", + "Goodbye World! (1)\n" + ] + } + ], + "source": [ + "void example4() {\n", + " #pragma omp parallel\n", + " {\n", + " std::cout << \"Hello World! (\" << omp_get_thread_num() << \")\" << std::endl;\n", + " }\n", + "\n", + " std::cout << \"This is another message! (\" << omp_get_thread_num() << \")\" << std::endl;\n", + "\n", + " #pragma omp parallel num_threads(2)\n", + " {\n", + " std::cout << \"Goodbye World! (\" << omp_get_thread_num() << \")\" << std::endl;\n", + " }\n", + "}\n", + "example4();" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5557e01a-7c7d-4b54-8545-962ad11027df", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initialize a[] time: 0.588681\n", + "Initialize b[] time: 0.513927\n", + "Add arrays time: 1.58928\n", + "Average result time: 0.637053\n", + "Average: 5e+08\n", + "Total time: 3.33191\n" + ] + } + ], + "source": [ + "void example5() {\n", + " double start_time = omp_get_wtime();\n", + " double start_loop;\n", + " \n", + " const int N = 1000000000;\n", + " int* a = new int[N];\n", + " int* b = new int[N];\n", + " \n", + " start_loop = omp_get_wtime();\n", + " #pragma omp parallel for\n", + " for (int i=0; i\n", + "#include " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9078ac79-ca50-4fef-b785-37f35fec3cab", + "metadata": {}, + "outputs": [], + "source": [ + "static long num_steps = 100000000;\n", + "double step;" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f3c10995-6f29-4d71-9e61-1993ca9d1cc9", + "metadata": {}, + "outputs": [], + "source": [ + "int main() {\n", + " int i, j, num_threads_allocated;\n", + " double x, pi, sum = 0.0;\n", + " double start_time, run_time;\n", + "\n", + " step = 1.0 / (double)num_steps;\n", + " printf(\"Num threads available: %d\\n\", omp_get_max_threads());\n", + " for (i = 1; i <= 4; i++) {\n", + " sum = 0.0;\n", + " omp_set_num_threads(i);\n", + " start_time = omp_get_wtime();\n", + "#pragma omp parallel\n", + " {\n", + " num_threads_allocated = omp_get_num_threads();\n", + "#pragma omp single\n", + " printf(\"Num threads allocated for this run: %d\\n\", num_threads_allocated);\n", + "\n", + "#pragma omp for reduction(+ : sum)\n", + " for (j = 1; j <= num_steps; j++) {\n", + " x = (j - 0.5) * step;\n", + " sum = sum + 4.0 / (1.0 + x * x);\n", + " }\n", + " }\n", + "\n", + " pi = step * sum;\n", + " run_time = omp_get_wtime() - start_time;\n", + " printf(\"pi is %f in %f seconds using %d threads\\n\\n\", pi, run_time, num_threads_allocated);\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "0f84442a-d947-4860-bd3c-aeeea963b419", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Num threads available: 8\n", + "Num threads allocated for this run: 1\n", + "pi is 3.141593 in 0.179501 seconds using 1 threads\n", + "\n", + "Num threads allocated for this run: 2\n", + "pi is 3.141592 in 0.184605 seconds using 2 threads\n", + "\n", + "Num threads allocated for this run: 3\n", + "pi is 3.141593 in 0.097145 seconds using 3 threads\n", + "\n", + "Num threads allocated for this run: 4\n", + "pi is 3.141593 in 0.071473 seconds using 4 threads\n", + "\n" + ] + } + ], + "source": [ + "main();" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "C++17 (xcpp+OpenMP)", + "language": "cpp", + "name": "xcpp17-omp" + }, + "language_info": { + "codemirror_mode": "text/x-c++src", + "file_extension": ".cpp", + "mimetype": "text/x-c++src", + "name": "C++", + "version": "17" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c72e260adb5810b0db70f60b03b914d37d1cd02a Mon Sep 17 00:00:00 2001 From: mcbarton <150042563+mcbarton@users.noreply.github.com> Date: Tue, 24 Feb 2026 15:17:51 +0000 Subject: [PATCH 6/7] Add test for C++ + OpenMP kernels --- test/test_xcpp_kernel.py | 55 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/test/test_xcpp_kernel.py b/test/test_xcpp_kernel.py index 69a9e69e..a421b023 100644 --- a/test/test_xcpp_kernel.py +++ b/test/test_xcpp_kernel.py @@ -63,7 +63,7 @@ def test_continuation(self) -> None: self.assertEqual(str(reply["content"]["indent"]), "") self.assertEqual(reply["content"]["status"], "complete") -kernel_names = ['xcpp17', 'xcpp20', 'xcpp23'] +kernel_names = ['xcpp17', 'xcpp20', 'xcpp23','xcpp17-omp', 'xcpp20-omp', 'xcpp23-omp'] for name in kernel_names: class_name = f"XCppCompleteTests_{name}" @@ -225,5 +225,58 @@ class BaseXCppTests2(jupyter_kernel_test.KernelTests): } ) +if platform.system() != 'Windows': + class BaseXCppOpenMPTests(jupyter_kernel_test.KernelTests): + __test__ = False + + # language_info.name in a kernel_info_reply should match this + language_name = 'C++' + + # OpenMP test that creates 2 threads, and gets them to output their thread + # number in descending order + code_omp=""" + #include + #include + """ + + code_omp_2=""" + int main() { + omp_set_num_threads(2); + #pragma omp parallel + { + if (omp_get_thread_num() == 1) { + printf("1"); + #pragma omp barrier + } + else if (omp_get_thread_num() == 0) { + #pragma omp barrier + printf("0"); + } + } + } + main(); + """ + + def test_xcpp_omp(self): + self.flush_channels() + reply, output_msgs = self.execute_helper(code=self.code_omp,timeout=20) + reply, output_msgs = self.execute_helper(code=self.code_omp_2,timeout=20) + self.assertEqual(output_msgs[0]['msg_type'], 'stream') + self.assertEqual(output_msgs[0]['content']['text'], '10') + self.assertEqual(output_msgs[0]['content']['name'], 'stdout') + + kernel_names = ['xcpp17-omp', 'xcpp20-omp', 'xcpp23-omp'] + + for name in kernel_names: + class_name = f"XCppOpenMPTests_{name}" + globals()[class_name] = type( + class_name, + (BaseXCppOpenMPTests,), + { + 'kernel_name': name, + '__test__': True + } + ) + if __name__ == '__main__': unittest.main() From 93e375a3daff433ba31f748f56c0f32a41254e5a Mon Sep 17 00:00:00 2001 From: mcbarton <150042563+mcbarton@users.noreply.github.com> Date: Mon, 9 Mar 2026 19:14:08 +0000 Subject: [PATCH 7/7] Add kernel_protocol_version to openmp kernelspecs (xeus 6.0 requirement) --- share/jupyter/kernels/xc11-omp/kernel.json.in | 1 + share/jupyter/kernels/xc17-omp/kernel.json.in | 1 + share/jupyter/kernels/xc23-omp/kernel.json.in | 1 + share/jupyter/kernels/xcpp17-omp/kernel.json.in | 1 + share/jupyter/kernels/xcpp20-omp/kernel.json.in | 1 + share/jupyter/kernels/xcpp23-omp/kernel.json.in | 1 + 6 files changed, 6 insertions(+) diff --git a/share/jupyter/kernels/xc11-omp/kernel.json.in b/share/jupyter/kernels/xc11-omp/kernel.json.in index e968cce8..66f008ed 100644 --- a/share/jupyter/kernels/xc11-omp/kernel.json.in +++ b/share/jupyter/kernels/xc11-omp/kernel.json.in @@ -9,6 +9,7 @@ "-std=c11","@XEUS_CPP_OMP@" ], "language": "c", + "kernel_protocol_version": "5.6.0", "metadata": {"debugger": false } } diff --git a/share/jupyter/kernels/xc17-omp/kernel.json.in b/share/jupyter/kernels/xc17-omp/kernel.json.in index c5ae6b8b..bf103d5e 100644 --- a/share/jupyter/kernels/xc17-omp/kernel.json.in +++ b/share/jupyter/kernels/xc17-omp/kernel.json.in @@ -9,6 +9,7 @@ "-std=c17","@XEUS_CPP_OMP@" ], "language": "c", + "kernel_protocol_version": "5.6.0", "metadata": {"debugger": false } } diff --git a/share/jupyter/kernels/xc23-omp/kernel.json.in b/share/jupyter/kernels/xc23-omp/kernel.json.in index 60751766..82fb6707 100644 --- a/share/jupyter/kernels/xc23-omp/kernel.json.in +++ b/share/jupyter/kernels/xc23-omp/kernel.json.in @@ -9,6 +9,7 @@ "-std=c23","@XEUS_CPP_OMP@" ], "language": "c", + "kernel_protocol_version": "5.6.0", "metadata": {"debugger": false } } diff --git a/share/jupyter/kernels/xcpp17-omp/kernel.json.in b/share/jupyter/kernels/xcpp17-omp/kernel.json.in index 23421755..04aae6b6 100644 --- a/share/jupyter/kernels/xcpp17-omp/kernel.json.in +++ b/share/jupyter/kernels/xcpp17-omp/kernel.json.in @@ -9,6 +9,7 @@ "-std=c++17","@XEUS_CPP_OMP@","-D_LIBCPP_DISABLE_AVAILABILITY" ], "language": "cpp", + "kernel_protocol_version": "5.6.0", "metadata": {"debugger": false } } diff --git a/share/jupyter/kernels/xcpp20-omp/kernel.json.in b/share/jupyter/kernels/xcpp20-omp/kernel.json.in index a43c184f..247f0508 100644 --- a/share/jupyter/kernels/xcpp20-omp/kernel.json.in +++ b/share/jupyter/kernels/xcpp20-omp/kernel.json.in @@ -9,6 +9,7 @@ "-std=c++20","@XEUS_CPP_OMP@","-D_LIBCPP_DISABLE_AVAILABILITY" ], "language": "cpp", + "kernel_protocol_version": "5.6.0", "metadata": {"debugger": false } } diff --git a/share/jupyter/kernels/xcpp23-omp/kernel.json.in b/share/jupyter/kernels/xcpp23-omp/kernel.json.in index 0e76e032..1ce76495 100644 --- a/share/jupyter/kernels/xcpp23-omp/kernel.json.in +++ b/share/jupyter/kernels/xcpp23-omp/kernel.json.in @@ -9,6 +9,7 @@ "-std=c++23","@XEUS_CPP_OMP@","-D_LIBCPP_DISABLE_AVAILABILITY" ], "language": "cpp", + "kernel_protocol_version": "5.6.0", "metadata": {"debugger": false } }