Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
9eab915
Add c++17,c++20 and c++23 kernels all with openmp
mcbarton Oct 9, 2025
b08557c
Update cmake to configure added c++ + openmp kernels + add llvm-openm…
mcbarton Oct 9, 2025
2b64303
Add example notebooks for c++ + openmp kernels
mcbarton Oct 9, 2025
9340472
Add c + openmp kernels
mcbarton Oct 9, 2025
28c8e2f
Configure c + openmp kernels cmake
mcbarton Oct 9, 2025
c728e10
Run existing tests for OpenMP kernels
mcbarton Oct 9, 2025
7a0cf2e
Add Simple OpenMP kernel test
mcbarton Oct 9, 2025
86cf7d5
Append :@XEUS_CPP_LD_LIBRARY_PATH@ to LD_LIBRARY_PATH in openmp kerne…
mcbarton Jan 14, 2026
7cbdd49
Apply suggestion now that CppInterOp v1.8.0 is out
mcbarton Jan 28, 2026
3818657
Try Vipul solution to failing bot
mcbarton Jan 29, 2026
68d05f0
Reverse order of asserts
mcbarton Jan 30, 2026
7ecb66d
Remove unneeded compiler-rt package
mcbarton Jan 30, 2026
d6ec118
Remove unneccessary logic in the cmake file
mcbarton Jan 30, 2026
8d2f1ed
Remove unneeded XEUS_CPP_PATH and XEUS_CPP_LD_LIBRARY_PATH
mcbarton Feb 1, 2026
88e43f3
Change cxx-compiler to clangxx to enable resource directory installat…
mcbarton Feb 4, 2026
637dc52
Add curl dependency
mcbarton Feb 4, 2026
430d4db
Try linking to curl in a different way
mcbarton Feb 4, 2026
b2a909b
Revert some changes relating to curl
mcbarton Feb 4, 2026
8e43722
find curl unix systems
mcbarton Feb 4, 2026
efb05be
Test fix
mcbarton Feb 4, 2026
11aa1bc
Fix for Windows
mcbarton Feb 4, 2026
8cbf406
Try Vipul Valgrind issue
mcbarton Feb 11, 2026
48de182
Fix clang format issue
mcbarton Feb 11, 2026
bcbe68f
Fix clang format issue
mcbarton Feb 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 26 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ endif()

find_package(argparse REQUIRED)
find_package(pugixml REQUIRED)
find_package(OpenMP)

# Configuration
# =============
Expand All @@ -130,14 +131,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}")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we still need this? Is that the include path to openmp? I feel uncomfortable exporting that information at build time whereas it's needed at runtime and we should be able to resolve that then. However, that's not a new problem per se because we already to this for other things..

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()
Expand Down Expand Up @@ -169,6 +169,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
# ============
Expand Down Expand Up @@ -343,8 +351,21 @@ macro(xeus_cpp_create_target target_name linkage output_name)
target_compile_options(${target_name} PRIVATE "/MD$<$<CONFIG:Debug>: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()
Expand Down
7 changes: 6 additions & 1 deletion environment-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ dependencies:
# Build dependencies
- make
- cmake
- cxx-compiler
- clangxx # [not win]
- cxx-compiler # [win]
# Host dependencies
- xeus>=5.0.0
- xeus-zmq<4.0
Expand All @@ -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
Expand Down
81 changes: 81 additions & 0 deletions notebooks/openmp-notebooks/hello_world.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "73cbab37-71dd-477d-981b-f2ec28c01bd6",
"metadata": {},
"outputs": [],
"source": [
"#include <stdio.h>\n",
"#include <omp.h>"
]
},
{
"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
}
223 changes: 223 additions & 0 deletions notebooks/openmp-notebooks/linked_list.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "156447d2-9279-45a0-890b-4e519d2c796b",
"metadata": {},
"outputs": [],
"source": [
"#include <stdlib.h>\n",
"#include <stdio.h>\n",
"#include <omp.h>"
]
},
{
"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
}
Loading
Loading