Skip to content

Commit 152c072

Browse files
committed
enable GPU IPC tests on Windows
1 parent cfc99b7 commit 152c072

File tree

8 files changed

+268
-136
lines changed

8 files changed

+268
-136
lines changed

.github/workflows/pr_push.yml

Lines changed: 1 addition & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -17,87 +17,16 @@ permissions:
1717
packages: read
1818

1919
jobs:
20-
CodeChecks:
21-
uses: ./.github/workflows/reusable_checks.yml
22-
FastBuild:
23-
name: Fast builds
24-
needs: [CodeChecks]
25-
uses: ./.github/workflows/reusable_fast.yml
26-
Build:
27-
name: Basic builds
28-
needs: [FastBuild]
29-
uses: ./.github/workflows/reusable_basic.yml
30-
DevDax:
31-
needs: [FastBuild]
32-
uses: ./.github/workflows/reusable_dax.yml
33-
MultiNuma:
34-
needs: [FastBuild]
35-
uses: ./.github/workflows/reusable_multi_numa.yml
3620
L0:
37-
needs: [Build]
3821
uses: ./.github/workflows/reusable_gpu.yml
3922
with:
4023
provider: "LEVEL_ZERO"
4124
runner: "L0"
4225
shared_lib: "['ON']"
43-
L0-BMG:
44-
needs: [Build]
45-
uses: ./.github/workflows/reusable_gpu.yml
46-
with:
47-
provider: "LEVEL_ZERO"
48-
runner: "L0-BMG"
49-
shared_lib: "['ON']"
5026
CUDA:
51-
needs: [Build]
5227
uses: ./.github/workflows/reusable_gpu.yml
5328
with:
5429
provider: "CUDA"
5530
runner: "CUDA"
5631
shared_lib: "['ON']"
57-
Sanitizers:
58-
needs: [FastBuild]
59-
uses: ./.github/workflows/reusable_sanitizers.yml
60-
QEMU:
61-
needs: [FastBuild]
62-
uses: ./.github/workflows/reusable_qemu.yml
63-
with:
64-
short_run: true
65-
ProxyLib:
66-
needs: [Build]
67-
uses: ./.github/workflows/reusable_proxy_lib.yml
68-
Valgrind:
69-
needs: [Build]
70-
uses: ./.github/workflows/reusable_valgrind.yml
71-
Coverage:
72-
# total coverage (on upstream only)
73-
if: github.repository == 'oneapi-src/unified-memory-framework'
74-
needs: [Build, DevDax, L0, CUDA, MultiNuma, QEMU, ProxyLib]
75-
uses: ./.github/workflows/reusable_coverage.yml
76-
secrets: inherit
77-
with:
78-
trigger: "${{github.event_name}}"
79-
Coverage_partial:
80-
# partial coverage (on forks)
81-
if: github.repository != 'oneapi-src/unified-memory-framework'
82-
needs: [Build, QEMU, ProxyLib]
83-
uses: ./.github/workflows/reusable_coverage.yml
84-
CodeQL:
85-
needs: [Build]
86-
permissions:
87-
contents: read
88-
security-events: write
89-
uses: ./.github/workflows/reusable_codeql.yml
90-
Trivy:
91-
needs: [Build]
92-
permissions:
93-
contents: read
94-
security-events: write
95-
uses: ./.github/workflows/reusable_trivy.yml
96-
Compatibility:
97-
needs: [Build]
98-
uses: ./.github/workflows/reusable_compatibility.yml
99-
strategy:
100-
matrix:
101-
tag: ["v1.0.1"]
102-
with:
103-
tag: ${{matrix.tag}}
32+

.github/workflows/reusable_gpu.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,11 @@ jobs:
129129

130130
- name: Run tests (Debug)
131131
working-directory: ${{env.BUILD_DEBUG_DIR}}
132-
run: ctest -C Debug --output-on-failure --test-dir test
132+
run: ctest -C Debug --verbose --test-dir test
133133

134134
- name: Run examples (Debug)
135135
working-directory: ${{env.BUILD_DEBUG_DIR}}
136-
run: ctest --output-on-failure --test-dir examples -C Debug
136+
run: ctest --verbose --test-dir examples -C Debug
137137

138138
- name: Configure build (Release)
139139
run: >

src/provider/provider_level_zero.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ static umf_result_t ze_memory_provider_open_ipc_handle(void *provider,
833833
}
834834
memcpy(&ze_ipc_handle, &fd_local, sizeof(fd_local));
835835
}
836-
836+
837837
ze_result = g_ze_ops.zeMemOpenIpcHandle(
838838
ze_provider->context, ze_provider->device, ze_ipc_handle, 0, ptr);
839839
if (fd_local != -1) {

src/utils/utils_windows_common.c

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <windows.h>
1111

1212
#include <assert.h>
13+
#include <handleapi.h>
1314
#include <processenv.h>
1415
#include <processthreadsapi.h>
1516
#include <stdio.h>
@@ -58,10 +59,34 @@ umf_result_t utils_errno_to_umf_result(int err) {
5859
}
5960

6061
umf_result_t utils_duplicate_fd(int pid, int fd_in, int *fd_out) {
61-
(void)pid; // unused
62-
(void)fd_in; // unused
63-
(void)fd_out; // unused
64-
return UMF_RESULT_ERROR_NOT_SUPPORTED;
62+
// TODO remove debug info
63+
HANDLE current_process_handle = GetCurrentProcess();
64+
if (!current_process_handle) {
65+
LOG_ERR("GetCurrentProcess() failed.");
66+
return UMF_RESULT_ERROR_UNKNOWN;
67+
}
68+
69+
HANDLE source_process_handle = OpenProcess(PROCESS_DUP_HANDLE, FALSE, pid);
70+
if (!source_process_handle) {
71+
LOG_ERR("OpenProcess() failed for pid=%d.", pid);
72+
CloseHandle(current_process_handle);
73+
return UMF_RESULT_ERROR_UNKNOWN;
74+
}
75+
76+
BOOL result = DuplicateHandle(
77+
source_process_handle, (HANDLE)(uintptr_t)fd_in, current_process_handle,
78+
(HANDLE *)(uintptr_t)fd_out, 0, FALSE, DUPLICATE_SAME_ACCESS);
79+
if (!result) {
80+
LOG_ERR("DuplicateHandle() failed for pid=%d fd_in=%d.", pid, fd_in);
81+
CloseHandle(current_process_handle);
82+
CloseHandle(source_process_handle);
83+
return UMF_RESULT_ERROR_UNKNOWN;
84+
}
85+
86+
CloseHandle(current_process_handle);
87+
CloseHandle(source_process_handle);
88+
89+
return result ? UMF_RESULT_SUCCESS : UMF_RESULT_ERROR_UNKNOWN;
6590
}
6691

6792
umf_result_t utils_translate_mem_protection_flags(unsigned in_protection,

test/CMakeLists.txt

Lines changed: 60 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -588,20 +588,74 @@ function(add_umf_ipc_test)
588588
set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
589589
endif()
590590

591-
file(COPY ${SRC_DIR}/${ARG_TEST}.sh DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
591+
if(WINDOWS)
592+
set(EXT bat)
593+
else()
594+
set(EXT sh)
595+
endif()
596+
597+
file(COPY ${SRC_DIR}/${ARG_TEST}.${EXT}
598+
DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
592599

593600
add_test(
594601
NAME ${TEST_NAME}
595-
COMMAND ${ARG_TEST}.sh
602+
COMMAND ${ARG_TEST}.${EXT}
596603
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
597604

605+
if(WINDOWS)
606+
set_tests_properties(${TEST_NAME} PROPERTIES
607+
ENVIRONMENT "BUILD_TYPE=${CMAKE_BUILD_TYPE}")
608+
# add PATH to DLL on Windows
609+
set(DLL_PATH_LIST
610+
"${DLL_PATH_LIST};PATH=path_list_append:${CMAKE_BINARY_DIR}/bin/;PATH=path_list_append:${CMAKE_BINARY_DIR}/bin/$<CONFIG>/"
611+
)
612+
set_property(TEST ${TEST_NAME} PROPERTY ENVIRONMENT_MODIFICATION
613+
"${DLL_PATH_LIST}")
614+
endif()
615+
598616
set_tests_properties(${TEST_NAME} PROPERTIES LABELS "umf")
599617
set_tests_properties(${TEST_NAME} PROPERTIES TIMEOUT 60)
600618
if(NOT UMF_TESTS_FAIL_ON_SKIP)
601619
set_tests_properties(${TEST_NAME} PROPERTIES SKIP_RETURN_CODE 125)
602620
endif()
603621
endfunction()
604622

623+
if(WINDOWS)
624+
set(UMF_IPC_LIBS ws2_32)
625+
endif()
626+
627+
if(UMF_BUILD_GPU_TESTS AND UMF_LEVEL_ZERO_ENABLED)
628+
build_umf_test(
629+
NAME ipc_level_zero_prov_consumer
630+
SRCS providers/ipc_level_zero_prov_consumer.c common/ipc_common.c
631+
providers/ipc_level_zero_prov_common.c
632+
${UMF_UTILS_DIR}/utils_level_zero.cpp
633+
LIBS ze_loader ${UMF_IPC_LIBS} ${UMF_UTILS_FOR_TEST})
634+
build_umf_test(
635+
NAME ipc_level_zero_prov_producer
636+
SRCS providers/ipc_level_zero_prov_producer.c common/ipc_common.c
637+
providers/ipc_level_zero_prov_common.c
638+
${UMF_UTILS_DIR}/utils_level_zero.cpp
639+
LIBS ze_loader ${UMF_IPC_LIBS} ${UMF_UTILS_FOR_TEST})
640+
add_umf_ipc_test(TEST ipc_level_zero_prov SRC_DIR providers)
641+
endif()
642+
643+
if(UMF_BUILD_GPU_TESTS AND UMF_BUILD_CUDA_PROVIDER)
644+
build_umf_test(
645+
NAME ipc_cuda_prov_consumer
646+
SRCS providers/ipc_cuda_prov_consumer.c common/ipc_common.c
647+
providers/ipc_cuda_prov_common.c providers/cuda_helpers.cpp
648+
LIBS cuda ${UMF_IPC_LIBS} ${UMF_UTILS_FOR_TEST})
649+
build_umf_test(
650+
NAME ipc_cuda_prov_producer
651+
SRCS providers/ipc_cuda_prov_producer.c common/ipc_common.c
652+
providers/ipc_cuda_prov_common.c providers/cuda_helpers.cpp
653+
LIBS cuda ${UMF_IPC_LIBS} ${UMF_UTILS_FOR_TEST})
654+
add_umf_ipc_test(TEST ipc_cuda_prov SRC_DIR providers)
655+
endif()
656+
657+
# TODO IPC tests for OS, file, devdax providers and proxy lib are supported only
658+
# on Linux - skipping
605659
if(LINUX)
606660
if(UMF_POOL_SCALABLE_ENABLED)
607661
build_umf_test(
@@ -645,39 +699,11 @@ if(LINUX)
645699
add_umf_ipc_test(TEST ipc_file_prov_fsdax)
646700
endif()
647701

648-
# TODO add IPC tests for CUDA
649-
650-
if(UMF_BUILD_GPU_TESTS AND UMF_LEVEL_ZERO_ENABLED)
651-
build_umf_test(
652-
NAME ipc_level_zero_prov_consumer
653-
SRCS providers/ipc_level_zero_prov_consumer.c common/ipc_common.c
654-
providers/ipc_level_zero_prov_common.c
655-
${UMF_UTILS_DIR}/utils_level_zero.cpp
656-
LIBS ze_loader ${UMF_UTILS_FOR_TEST})
657-
build_umf_test(
658-
NAME ipc_level_zero_prov_producer
659-
SRCS providers/ipc_level_zero_prov_producer.c common/ipc_common.c
660-
providers/ipc_level_zero_prov_common.c
661-
${UMF_UTILS_DIR}/utils_level_zero.cpp
662-
LIBS ze_loader ${UMF_UTILS_FOR_TEST})
663-
add_umf_ipc_test(TEST ipc_level_zero_prov SRC_DIR providers)
664-
endif()
665-
666-
if(UMF_BUILD_GPU_TESTS AND UMF_BUILD_CUDA_PROVIDER)
667-
build_umf_test(
668-
NAME ipc_cuda_prov_consumer
669-
SRCS providers/ipc_cuda_prov_consumer.c common/ipc_common.c
670-
providers/ipc_cuda_prov_common.c providers/cuda_helpers.cpp
671-
LIBS cuda ${UMF_UTILS_FOR_TEST})
672-
build_umf_test(
673-
NAME ipc_cuda_prov_producer
674-
SRCS providers/ipc_cuda_prov_producer.c common/ipc_common.c
675-
providers/ipc_cuda_prov_common.c providers/cuda_helpers.cpp
676-
LIBS cuda ${UMF_UTILS_FOR_TEST})
677-
add_umf_ipc_test(TEST ipc_cuda_prov SRC_DIR providers)
678-
endif()
679702
else()
680-
message(STATUS "IPC tests are supported on Linux only - skipping")
703+
message(
704+
STATUS
705+
"IPC tests for OS, file, devdax providers and proxy lib are supported only on Linux - skipping"
706+
)
681707
endif()
682708

683709
if(LINUX

0 commit comments

Comments
 (0)