From 3a82dd01bfcef38968afb523307778aca9ad01f8 Mon Sep 17 00:00:00 2001 From: Ben Ashbaugh Date: Tue, 1 Aug 2023 22:17:50 -0700 Subject: [PATCH] add an SVM unmap test see: https://github.com/KhronosGroup/OpenCL-Docs/issues/890 --- samples/99_svmunmap/CMakeLists.txt | 10 +++++ samples/99_svmunmap/main.cpp | 67 ++++++++++++++++++++++++++++++ samples/CMakeLists.txt | 2 + 3 files changed, 79 insertions(+) create mode 100644 samples/99_svmunmap/CMakeLists.txt create mode 100644 samples/99_svmunmap/main.cpp diff --git a/samples/99_svmunmap/CMakeLists.txt b/samples/99_svmunmap/CMakeLists.txt new file mode 100644 index 0000000..be549b0 --- /dev/null +++ b/samples/99_svmunmap/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (c) 2023 Ben Ashbaugh +# +# SPDX-License-Identifier: MIT + +add_opencl_sample( + TEST + NUMBER 99 + TARGET svmunmap + VERSION 200 + SOURCES main.cpp) diff --git a/samples/99_svmunmap/main.cpp b/samples/99_svmunmap/main.cpp new file mode 100644 index 0000000..f3160f0 --- /dev/null +++ b/samples/99_svmunmap/main.cpp @@ -0,0 +1,67 @@ +/* +// Copyright (c) 2023 Ben Ashbaugh +// +// SPDX-License-Identifier: MIT +*/ + +#include + +#include + +int main(int argc, char** argv) +{ + int platformIndex = 0; + int deviceIndex = 0; + + { + popl::OptionParser op("Supported Options"); + op.add>("p", "platform", "Platform Index", platformIndex, &platformIndex); + op.add>("d", "device", "Device Index", deviceIndex, &deviceIndex); + + bool printUsage = false; + try { + op.parse(argc, argv); + } catch (std::exception& e) { + fprintf(stderr, "Error: %s\n\n", e.what()); + printUsage = true; + } + + if (printUsage || !op.unknown_options().empty() || !op.non_option_args().empty()) { + fprintf(stderr, + "Usage: copybuffer [options]\n" + "%s", op.help().c_str()); + return -1; + } + } + + std::vector platforms; + cl::Platform::get(&platforms); + + printf("Running on platform: %s\n", + platforms[platformIndex].getInfo().c_str() ); + + std::vector devices; + platforms[platformIndex].getDevices(CL_DEVICE_TYPE_ALL, &devices); + + printf("Running on device: %s\n", + devices[deviceIndex].getInfo().c_str() ); + + cl::Context context{devices[deviceIndex]}; + cl::CommandQueue commandQueue = cl::CommandQueue{context, devices[deviceIndex]}; + + void* ptr = clSVMAlloc(context(), CL_MEM_READ_WRITE, 1024, 0); + printf("clSVMAlloc returned %p\n", ptr); + + cl_event event = nullptr; + cl_int errorCode = clEnqueueSVMUnmap( + commandQueue(), + ptr, + 0, + nullptr, + &event); + printf("clEnqueueSVMUnmap returned %d, event is %p.\n", errorCode, event); + clReleaseEvent(event); + + clSVMFree(context(), ptr); + return 0; +} diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index 65cbd34..2169021 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -90,6 +90,8 @@ add_subdirectory( 06_ndrangekernelfromfile ) add_subdirectory( 10_queueexperiments ) +add_subdirectory( 99_svmunmap ) + set(BUILD_EXTENSION_SAMPLES TRUE) if(NOT TARGET OpenCLExt) message(STATUS "Skipping Extension Samples - OpenCL Extension Loader is not found.")