EXSWHTEC-380 - Implement tests for Virtual Memory Management API functions #448
Change-Id: Ic766be69fddd0309f7ad4093465494cc14c7c70b
[ROCm/hip-tests commit: 00433d4f87]
This commit is contained in:
committed by
Rakesh Roy
parent
ad4d04fa88
commit
d439c6b986
@@ -92,6 +92,8 @@
|
||||
"Unit_hipMemcpy_Positive_Synchronization_Behavior",
|
||||
"=== Below tests fail in external CI for PR https://github.com/ROCm-Developer-Tools/hip-tests/pull/210 ===",
|
||||
"Unit_StaticAssert_Positive_Basic",
|
||||
"Unit_StaticAssert_Negative_Basic"
|
||||
"Unit_StaticAssert_Negative_Basic",
|
||||
"Unit_hipMemImportFromShareableHandle_Positive_MultiProc",
|
||||
"Unit_hipMemMapArrayAsync_Positive_Basic"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
"Performance_hipMemsetD32",
|
||||
"Performance_hipMemsetD32Async",
|
||||
"Unit_hipMemcpyParam2D_Positive_Synchronization_Behavior",
|
||||
"Unit_hipMemcpy_Positive_Synchronization_Behavior"
|
||||
"Unit_hipMemcpy_Positive_Synchronization_Behavior",
|
||||
"Unit_hipMemMapArrayAsync_Positive_Basic"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -103,16 +103,9 @@ THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup KernelTest Kernel Functions Management
|
||||
* @{
|
||||
* This section describes the various kernel functions invocation.
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup AtomicsTest Device Atomics
|
||||
* @defgroup KernelTest Kernel Functions Management
|
||||
* @{
|
||||
* This section describes tests for the Device Atomic APIs.
|
||||
* This section describes the various kernel functions invocation.
|
||||
* @}
|
||||
*/
|
||||
|
||||
@@ -140,7 +133,8 @@ THE SOFTWARE.
|
||||
/**
|
||||
* @defgroup PeerToPeerTest PeerToPeer Device Memory Access
|
||||
* @{
|
||||
* This section describes tests for the PeerToPeer device memory access functions of HIP runtime API.
|
||||
* This section describes tests for the PeerToPeer device memory access functions of HIP runtime
|
||||
* API.
|
||||
* @warning PeerToPeer support is experimental.
|
||||
* @}
|
||||
*/
|
||||
@@ -200,124 +194,6 @@ THE SOFTWARE.
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup AtomicsTest Device Atomics
|
||||
* @{
|
||||
* This section describes tests for the Device Atomic APIs.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup atomicAdd atomicAdd
|
||||
* @{
|
||||
* @ingroup AtomicsTest
|
||||
*/
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Compiles atomicAdd with invalid parameters.
|
||||
* - Compiles the source with specialized Python tool.
|
||||
* -# Utilizes sub-process to invoke compilation of faulty source.
|
||||
* -# Performs post-processing of compiler output and counts errors.
|
||||
* Test source
|
||||
* ------------------------
|
||||
* - unit/atomics/CMakeLists.txt
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 5.2
|
||||
*/
|
||||
TEST_CASE("Unit_atomicAdd_Negative_Parameters") {}
|
||||
/**
|
||||
* End doxygen group atomicAdd.
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup atomicSub atomicSub
|
||||
* @{
|
||||
* @ingroup AtomicsTest
|
||||
*/
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Compiles atomicSub with invalid parameters.
|
||||
* - Compiles the source with specialized Python tool.
|
||||
* -# Utilizes sub-process to invoke compilation of faulty source.
|
||||
* -# Performs post-processing of compiler output and counts errors.
|
||||
* Test source
|
||||
* ------------------------
|
||||
* - unit/atomics/CMakeLists.txt
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 5.2
|
||||
*/
|
||||
TEST_CASE("Unit_atomicSub_Negative_Parameters") {}
|
||||
/**
|
||||
* End doxygen group atomicSub.
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup atomicInc atomicInc
|
||||
* @{
|
||||
* @ingroup AtomicsTest
|
||||
*/
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Compiles atomicInc with invalid parameters.
|
||||
* - Compiles the source with specialized Python tool.
|
||||
* -# Utilizes sub-process to invoke compilation of faulty source.
|
||||
* -# Performs post-processing of compiler output and counts errors.
|
||||
* Test source
|
||||
* ------------------------
|
||||
* - unit/atomics/CMakeLists.txt
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 5.2
|
||||
*/
|
||||
TEST_CASE("Unit_atomicInc_Negative_Parameters") {}
|
||||
/**
|
||||
* End doxygen group atomicInc.
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup atomicDec atomicDec
|
||||
* @{
|
||||
* @ingroup AtomicsTest
|
||||
*/
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Compiles atomicDec with invalid parameters.
|
||||
* - Compiles the source with specialized Python tool.
|
||||
* -# Utilizes sub-process to invoke compilation of faulty source.
|
||||
* -# Performs post-processing of compiler output and counts errors.
|
||||
* Test source
|
||||
* ------------------------
|
||||
* - unit/atomics/CMakeLists.txt
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 5.2
|
||||
*/
|
||||
TEST_CASE("Unit_atomicDec_Negative_Parameters") {}
|
||||
/**
|
||||
* End doxygen group atomicDec.
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* End doxygen group AtomicsTest.
|
||||
* @defgroup MathTest Math Device Functions
|
||||
* @{
|
||||
* This section describes tests for device math functions of HIP runtime API.
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup MathTest Math Device Functions
|
||||
* @{
|
||||
@@ -347,62 +223,8 @@ TEST_CASE("Unit_atomicDec_Negative_Parameters") {}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup DeviceLanguageTest Device Language
|
||||
* @defgroup VirtualMemoryManagementTest Virtual Memory Management APIs
|
||||
* @{
|
||||
* This section describes tests for the Device Language API.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup launch_bounds launch_bounds
|
||||
* @{
|
||||
* @ingroup DeviceLanguageTest
|
||||
*/
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Validates handling of invalid arguments:
|
||||
* -# Compiles kernels that are not created appropriately:
|
||||
* - Maximum number of threads is 0
|
||||
* - Maximum number of threads is not integer value
|
||||
* - Mimimum number of warps is not integer value
|
||||
* -# Expected output: compiler error
|
||||
* Test source
|
||||
* ------------------------
|
||||
* - unit/launch_bounds/CMakeLists.txt
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 5.2
|
||||
*/
|
||||
TEST_CASE("Unit_Kernel_Launch_bounds_Negative_Parameters_CompilerError") {}
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Validates handling of invalid arguments:
|
||||
* -# Compiles kernels that are not created appropriately:
|
||||
* - Maximum number of threads is negative
|
||||
* - Mimimum number of warps is negative
|
||||
* - Validates handling of invalid arguments:
|
||||
* -# Expected output: parse error
|
||||
* Test source
|
||||
* ------------------------
|
||||
* - unit/launch_bounds/CMakeLists.txt
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 5.2
|
||||
*/
|
||||
TEST_CASE("Unit_Kernel_Launch_bounds_Negative_Parameters_ParseError") {}
|
||||
|
||||
/**
|
||||
* End doxygen group launch_bounds.
|
||||
* This section describes the virtual memory management types & functions of HIP runtime API.
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* End doxygen group DeviceLanguageTest.
|
||||
* @}
|
||||
* @defgroup VectorTypeTest Vector types
|
||||
* @{
|
||||
* This section describes tests for the Vector type functions and operators.
|
||||
*/
|
||||
|
||||
@@ -52,6 +52,7 @@ add_subdirectory(p2p)
|
||||
add_subdirectory(gcc)
|
||||
add_subdirectory(syncthreads)
|
||||
add_subdirectory(threadfence)
|
||||
add_subdirectory(virtualMemoryManagement)
|
||||
|
||||
if(HIP_PLATFORM STREQUAL "amd")
|
||||
add_subdirectory(callback)
|
||||
|
||||
@@ -94,7 +94,8 @@ if(HIP_PLATFORM MATCHES "amd")
|
||||
hipMemAddressFree.cc
|
||||
hipMemAddressReserve.cc
|
||||
hipMemRelease.cc
|
||||
hipMemGetAllocationPropertiesFromHandle.cc)
|
||||
hipMemGetAllocationPropertiesFromHandle.cc
|
||||
hipArray.cc)
|
||||
else()
|
||||
set(TEST_SRC ${TEST_SRC} hipGetSymbolSizeAddress.cc)
|
||||
endif()
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2023 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "hip_test_context.hh"
|
||||
|
||||
#define checkVMMSupported(device) {\
|
||||
int value = 0;\
|
||||
hipDeviceAttribute_t\
|
||||
attr = hipDeviceAttributeVirtualMemoryManagementSupported;\
|
||||
HIP_CHECK(\
|
||||
hipDeviceGetAttribute(&value, attr, device));\
|
||||
if (value == 0) {\
|
||||
HipTest::HIP_SKIP_TEST("Machine does not support VMM. Skipping Test..");\
|
||||
return;\
|
||||
}\
|
||||
}
|
||||
|
||||
#define checkVMMSupportedRetVal(device) {\
|
||||
int value = 0;\
|
||||
hipDeviceAttribute_t\
|
||||
attr = hipDeviceAttributeVirtualMemoryManagementSupported;\
|
||||
HIP_CHECK(\
|
||||
hipDeviceGetAttribute(&value, attr, device));\
|
||||
if (value == 0) {\
|
||||
HipTest::HIP_SKIP_TEST("Machine does not support VMM. Skipping Test..");\
|
||||
return true;\
|
||||
}\
|
||||
}
|
||||
|
||||
constexpr int threadsPerBlk = 64;
|
||||
@@ -0,0 +1,55 @@
|
||||
# Copyright (c) 2023 Advanced Micro Devices, Inc. All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
|
||||
set(TEST_SRC
|
||||
hipMemGetAllocationGranularity.cc
|
||||
hipMemRetainAllocationHandle.cc)
|
||||
|
||||
if(HIP_PLATFORM MATCHES "nvidia")
|
||||
set(TEST_SRC
|
||||
${TEST_SRC}
|
||||
hipMemMapArrayAsync.cc)
|
||||
|
||||
if(UNIX) # Disabled on AMD due to defect EXSWHTEC-375
|
||||
set(TEST_SRC
|
||||
${TEST_SRC}
|
||||
hipMemExportToShareableHandle.cc
|
||||
hipMemImportFromShareableHandle.cc)
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
||||
if(HIP_PLATFORM MATCHES "amd")
|
||||
set(TEST_SRC
|
||||
${TEST_SRC}
|
||||
hipMemAddressFree.cc
|
||||
hipMemAddressReserve.cc
|
||||
hipMemCreate.cc
|
||||
hipMemSetGetAccess.cc
|
||||
hipMemGetAllocationPropertiesFromHandle.cc
|
||||
hipMemMap.cc
|
||||
hipMemRelease.cc
|
||||
hipMemUnmap.cc
|
||||
hipMemVmm_old.cc)
|
||||
endif()
|
||||
|
||||
hip_add_exe_to_target(NAME VirtualMemoryManagementTest
|
||||
TEST_SRC ${TEST_SRC}
|
||||
TEST_TARGET_NAME build_tests COMMON_SHARED_SRC ${COMMON_SHARED_SRC})
|
||||
+8
-10
@@ -23,12 +23,13 @@ THE SOFTWARE.
|
||||
/**
|
||||
* @addtogroup hipMemAddressFree hipMemAddressFree
|
||||
* @{
|
||||
* @ingroup MemoryTest
|
||||
* @ingroup VirtualMemoryManagementTest
|
||||
* `hipError_t hipMemAddressFree (void* devPtr, size_t size)` -
|
||||
* Frees an address range reservation made via hipMemAddressReserve.
|
||||
*/
|
||||
|
||||
#include <hip_test_common.hh>
|
||||
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
#define DATA_SIZE (1 << 13)
|
||||
@@ -38,7 +39,7 @@ THE SOFTWARE.
|
||||
* ------------------------
|
||||
* - Negative Tests
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemAddressFree.cc
|
||||
* - unit/virtualMemoryManagement/hipMemAddressFree.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -50,16 +51,15 @@ TEST_CASE("Unit_hipMemAddressFree_negative") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
// Allocate virtual address range
|
||||
hipDeviceptr_t ptrA;
|
||||
HIP_CHECK(hipMemAddressReserve(&ptrA, size_mem, 0, 0, 0));
|
||||
@@ -68,9 +68,7 @@ TEST_CASE("Unit_hipMemAddressFree_negative") {
|
||||
REQUIRE(hipMemAddressFree(nullptr, size_mem) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("pass zero to size") {
|
||||
REQUIRE(hipMemAddressFree(ptrA, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
SECTION("pass zero to size") { REQUIRE(hipMemAddressFree(ptrA, 0) == hipErrorInvalidValue); }
|
||||
|
||||
HIP_CHECK(hipMemAddressFree(ptrA, size_mem));
|
||||
}
|
||||
+19
-21
@@ -23,7 +23,7 @@ THE SOFTWARE.
|
||||
/**
|
||||
* @addtogroup hipMemAddressReserve hipMemAddressReserve
|
||||
* @{
|
||||
* @ingroup MemoryTest
|
||||
* @ingroup VirtualMemoryManagementTest
|
||||
* `hipError_t hipMemAddressReserve (void** ptr,
|
||||
* size_t size,
|
||||
* size_t alignment,
|
||||
@@ -33,6 +33,7 @@ THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <hip_test_common.hh>
|
||||
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
#define DATA_SIZE (1 << 13)
|
||||
@@ -43,7 +44,7 @@ THE SOFTWARE.
|
||||
* - Verify if reserved address returned by hipMemAddressReserve
|
||||
* for different alignment values are correctly aligned.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemAddressReserve.cc
|
||||
* - unit/virtualMemoryManagement/hipMemAddressReserve.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -56,16 +57,15 @@ TEST_CASE("Unit_hipMemAddressReserve_AlignmentTest") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
// Allocate virtual address range
|
||||
hipDeviceptr_t ptrA;
|
||||
size_t alignmnt = 1;
|
||||
@@ -106,7 +106,7 @@ TEST_CASE("Unit_hipMemAddressReserve_AlignmentTest") {
|
||||
* ------------------------
|
||||
* - Negative Tests
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemAddressReserve.cc
|
||||
* - unit/virtualMemoryManagement/hipMemAddressReserve.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -118,35 +118,33 @@ TEST_CASE("Unit_hipMemAddressReserve_Negative") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
// Allocate virtual address range
|
||||
hipDeviceptr_t ptrA;
|
||||
|
||||
SECTION("Nullptr to ptr") {
|
||||
REQUIRE(hipMemAddressReserve(nullptr, size_mem, 0, 0, 0) ==
|
||||
hipErrorInvalidValue);
|
||||
REQUIRE(hipMemAddressReserve(nullptr, size_mem, 0, 0, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("pass size as 0") {
|
||||
REQUIRE(hipMemAddressReserve(&ptrA, 0, 0, 0, 0) ==
|
||||
hipErrorMemoryAllocation);
|
||||
REQUIRE(hipMemAddressReserve(&ptrA, 0, 0, 0, 0) == hipErrorMemoryAllocation);
|
||||
}
|
||||
|
||||
#if HT_NVIDIA
|
||||
SECTION("pass non power of two for alignment") {
|
||||
REQUIRE(hipMemAddressReserve(&ptrA, size_mem, 3, 0, 0) ==
|
||||
hipErrorMemoryAllocation);
|
||||
REQUIRE(hipMemAddressReserve(&ptrA, size_mem, 3, 0, 0) == hipErrorMemoryAllocation);
|
||||
}
|
||||
#endif
|
||||
|
||||
SECTION("pass size as non multiple of host page size") {
|
||||
REQUIRE(hipMemAddressReserve(&ptrA, (size_mem - 1), 0, 0, 0) ==
|
||||
hipErrorMemoryAllocation);
|
||||
REQUIRE(hipMemAddressReserve(&ptrA, (size_mem - 1), 0, 0, 0) == hipErrorMemoryAllocation);
|
||||
}
|
||||
}
|
||||
+48
-68
@@ -19,20 +19,23 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup hipMemCreate hipMemCreate
|
||||
* @{
|
||||
* @ingroup MemoryTest
|
||||
* @ingroup VirtualMemoryManagementTest
|
||||
* `hipError_t hipMemCreate (hipMemGenericAllocationHandle_t* handle,
|
||||
* size_t size,
|
||||
* const hipMemAllocationProp* prop,
|
||||
* unsigned long long flags)` -
|
||||
* Creates a memory allocation described by the properties and size.
|
||||
*/
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
#include <hip_test_kernels.hh>
|
||||
#include <hip_test_common.hh>
|
||||
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
#define THREADS_PER_BLOCK 512
|
||||
#define NUM_OF_BUFFERS 3
|
||||
#define DATA_SIZE (1 << 13)
|
||||
@@ -52,7 +55,7 @@ static __global__ void square_kernel(int* Buff) {
|
||||
* - Allocate physical memories for different multiples of
|
||||
* granularity and deallocate them.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemCreate.cc
|
||||
* - unit/virtualMemoryManagement/hipMemCreate.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -62,19 +65,18 @@ TEST_CASE("Unit_hipMemCreate_BasicAllocateDeAlloc_MultGranularity") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
// Allocate physical memory
|
||||
for (int mul = 1; mul < 64; mul++) {
|
||||
HIP_CHECK(hipMemCreate(&handle, granularity*mul, &prop, 0));
|
||||
HIP_CHECK(hipMemCreate(&handle, granularity * mul, &prop, 0));
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
}
|
||||
}
|
||||
@@ -87,7 +89,7 @@ TEST_CASE("Unit_hipMemCreate_BasicAllocateDeAlloc_MultGranularity") {
|
||||
* and back to host. Verify the result. Release handle at end after
|
||||
* unmapping VMM range.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemCreate.cc
|
||||
* - unit/virtualMemoryManagement/hipMemCreate.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -99,17 +101,15 @@ TEST_CASE("Unit_hipMemCreate_ChkDev2HstMemcpy_ReleaseHdlPostUnmap") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
// Allocate physical memory
|
||||
HIP_CHECK(hipMemCreate(&handle, size_mem, &prop, 0));
|
||||
@@ -146,7 +146,7 @@ TEST_CASE("Unit_hipMemCreate_ChkDev2HstMemcpy_ReleaseHdlPostUnmap") {
|
||||
* to VMM memory and back to host. Verify the result. Release
|
||||
* handle before the VMM range is used.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemCreate.cc
|
||||
* - unit/virtualMemoryManagement/hipMemCreate.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -158,17 +158,15 @@ TEST_CASE("Unit_hipMemCreate_ChkDev2HstMemcpy_ReleaseHdlPreUse") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
// Allocate physical memory
|
||||
HIP_CHECK(hipMemCreate(&handle, size_mem, &prop, 0));
|
||||
@@ -205,12 +203,11 @@ TEST_CASE("Unit_hipMemCreate_ChkDev2HstMemcpy_ReleaseHdlPreUse") {
|
||||
* to device, launch kernel to square the data, copy data back
|
||||
* to host. Verify the result.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemCreate.cc
|
||||
* - unit/virtualMemoryManagement/hipMemCreate.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
|
||||
TEST_CASE("Unit_hipMemCreate_ChkWithKerLaunch") {
|
||||
size_t granularity = 0;
|
||||
constexpr int N = DATA_SIZE;
|
||||
@@ -218,17 +215,15 @@ TEST_CASE("Unit_hipMemCreate_ChkWithKerLaunch") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
// Allocate physical memory
|
||||
HIP_CHECK(hipMemCreate(&handle, size_mem, &prop, 0));
|
||||
@@ -248,12 +243,12 @@ TEST_CASE("Unit_hipMemCreate_ChkWithKerLaunch") {
|
||||
// Initialize with data
|
||||
for (size_t idx = 0; idx < N; idx++) {
|
||||
A_h[idx] = idx;
|
||||
C_h[idx] = idx*idx;
|
||||
C_h[idx] = idx * idx;
|
||||
}
|
||||
HIP_CHECK(hipMemcpyHtoD(ptrA, A_h.data(), buffer_size));
|
||||
// Invoke kernel
|
||||
hipLaunchKernelGGL(square_kernel, dim3(N / THREADS_PER_BLOCK),
|
||||
dim3(THREADS_PER_BLOCK), 0, 0, static_cast<int*>(ptrA));
|
||||
hipLaunchKernelGGL(square_kernel, dim3(N / THREADS_PER_BLOCK), dim3(THREADS_PER_BLOCK), 0, 0,
|
||||
static_cast<int*>(ptrA));
|
||||
HIP_CHECK(hipMemcpyDtoH(B_h.data(), ptrA, buffer_size));
|
||||
HIP_CHECK(hipDeviceSynchronize());
|
||||
REQUIRE(true == std::equal(B_h.begin(), B_h.end(), C_h.data()));
|
||||
@@ -269,7 +264,7 @@ TEST_CASE("Unit_hipMemCreate_ChkWithKerLaunch") {
|
||||
* device permission, copy data from host to device, launch kernel
|
||||
* to square the data, copy data back to host. Verify the result.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemCreate.cc
|
||||
* - unit/virtualMemoryManagement/hipMemCreate.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -282,17 +277,15 @@ TEST_CASE("Unit_hipMemCreate_MapNonContiguousChunks") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle[NUM_OF_BUFFERS];
|
||||
// Allocate 3 physical memory chunks
|
||||
for (int count = 0; count < numOfBuffers; count++) {
|
||||
@@ -304,8 +297,7 @@ TEST_CASE("Unit_hipMemCreate_MapNonContiguousChunks") {
|
||||
for (int idx = 0; idx < numOfBuffers; idx++) {
|
||||
uint64_t uiptr = reinterpret_cast<uint64_t>(ptrA);
|
||||
uiptr = uiptr + idx * size_mem;
|
||||
HIP_CHECK(hipMemMap(reinterpret_cast<void*>(uiptr), size_mem, 0,
|
||||
handle[idx], 0));
|
||||
HIP_CHECK(hipMemMap(reinterpret_cast<void*>(uiptr), size_mem, 0, handle[idx], 0));
|
||||
HIP_CHECK(hipMemRelease(handle[idx]));
|
||||
}
|
||||
hipMemAccessDesc accessDesc = {};
|
||||
@@ -315,16 +307,16 @@ TEST_CASE("Unit_hipMemCreate_MapNonContiguousChunks") {
|
||||
// Make the address accessible to GPU 0
|
||||
HIP_CHECK(hipMemSetAccess(ptrA, (numOfBuffers * size_mem), &accessDesc, 1));
|
||||
std::vector<int> A_h(numOfBuffers * size_mem), B_h(numOfBuffers * size_mem),
|
||||
C_h(numOfBuffers * size_mem);
|
||||
C_h(numOfBuffers * size_mem);
|
||||
// Fill Data
|
||||
for (size_t idx = 0; idx < (numOfBuffers * N); idx++) {
|
||||
A_h[idx] = idx;
|
||||
C_h[idx] = idx*idx;
|
||||
C_h[idx] = idx * idx;
|
||||
}
|
||||
HIP_CHECK(hipMemcpyHtoD(ptrA, A_h.data(), numOfBuffers * buffer_size));
|
||||
// Launch square kernel
|
||||
hipLaunchKernelGGL(square_kernel, dim3(N / THREADS_PER_BLOCK),
|
||||
dim3(THREADS_PER_BLOCK), 0, 0, static_cast<int*>(ptrA));
|
||||
hipLaunchKernelGGL(square_kernel, dim3(N / THREADS_PER_BLOCK), dim3(THREADS_PER_BLOCK), 0, 0,
|
||||
static_cast<int*>(ptrA));
|
||||
HIP_CHECK(hipMemcpyDtoH(B_h.data(), ptrA, numOfBuffers * buffer_size));
|
||||
HIP_CHECK(hipDeviceSynchronize());
|
||||
// Validate Results
|
||||
@@ -344,7 +336,7 @@ TEST_CASE("Unit_hipMemCreate_MapNonContiguousChunks") {
|
||||
* to the VMM address range. Memset the VMM address range with initial
|
||||
* value. Validate.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemCreate.cc
|
||||
* - unit/virtualMemoryManagement/hipMemCreate.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -357,17 +349,15 @@ TEST_CASE("Unit_hipMemCreate_ChkWithMemset") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
// Allocate physical memory
|
||||
HIP_CHECK(hipMemCreate(&handle, size_mem, &prop, 0));
|
||||
@@ -398,7 +388,7 @@ TEST_CASE("Unit_hipMemCreate_ChkWithMemset") {
|
||||
* ------------------------
|
||||
* - Negative Tests
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemCreate.cc
|
||||
* - unit/virtualMemoryManagement/hipMemCreate.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -408,58 +398,48 @@ TEST_CASE("Unit_hipMemCreate_Negative") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
hipMemAllocationProp prop = {};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Device
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
|
||||
SECTION("Nullptr to handle") {
|
||||
REQUIRE(hipMemCreate(nullptr, granularity, &prop, 0) ==
|
||||
hipErrorInvalidValue);
|
||||
REQUIRE(hipMemCreate(nullptr, granularity, &prop, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("Nullptr to prop") {
|
||||
REQUIRE(hipMemCreate(&handle, granularity, nullptr, 0) ==
|
||||
hipErrorInvalidValue);
|
||||
REQUIRE(hipMemCreate(&handle, granularity, nullptr, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("pass size as 0") {
|
||||
REQUIRE(hipMemCreate(&handle, 0, &prop, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
SECTION("pass size as 0") { REQUIRE(hipMemCreate(&handle, 0, &prop, 0) == hipErrorInvalidValue); }
|
||||
|
||||
SECTION("Pass prop type as invalid") {
|
||||
prop.type = hipMemAllocationTypeInvalid;
|
||||
REQUIRE(hipMemCreate(&handle, granularity, &prop, 0) ==
|
||||
hipErrorInvalidValue);
|
||||
REQUIRE(hipMemCreate(&handle, granularity, &prop, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("pass location as invalid") {
|
||||
prop.location.type = hipMemLocationTypeInvalid;
|
||||
REQUIRE(hipMemCreate(&handle, granularity, &prop, 0) ==
|
||||
hipErrorInvalidValue);
|
||||
REQUIRE(hipMemCreate(&handle, granularity, &prop, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("non multiple of granularity") {
|
||||
REQUIRE(hipMemCreate(&handle, (granularity - 1), &prop, 0) ==
|
||||
hipErrorInvalidValue);
|
||||
REQUIRE(hipMemCreate(&handle, (granularity - 1), &prop, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("pass location id as -1") {
|
||||
prop.location.id = -1; // set to non existing device
|
||||
REQUIRE(hipMemCreate(&handle, granularity, &prop, 0) ==
|
||||
hipErrorInvalidValue);
|
||||
REQUIRE(hipMemCreate(&handle, granularity, &prop, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("pass location id as > highest device number") {
|
||||
int numDevices = 0;
|
||||
HIP_CHECK(hipGetDeviceCount(&numDevices));
|
||||
prop.location.id = numDevices; // set to non existing device
|
||||
REQUIRE(hipMemCreate(&handle, granularity, &prop, 0) ==
|
||||
hipErrorInvalidValue);
|
||||
REQUIRE(hipMemCreate(&handle, granularity, &prop, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
}
|
||||
+145
@@ -0,0 +1,145 @@
|
||||
/*
|
||||
Copyright (c) 2023 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup hipMemExportToShareableHandle hipMemExportToShareableHandle
|
||||
* @{
|
||||
* @ingroup VirtualMemoryManagementTest
|
||||
* `hipError_t hipMemExportToShareableHandle(void *shareableHandle,
|
||||
* hipMemGenericAllocationHandle_t handle,
|
||||
* hipMemAllocationHandleType handleType,
|
||||
* unsigned long long flags)` -
|
||||
* Exports an allocation to a requested shareable handle type.
|
||||
*/
|
||||
|
||||
#include <hip_test_common.hh>
|
||||
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Basic sanity test.
|
||||
* ------------------------
|
||||
* - unit/virtualMemoryManagement/hipMemExportToShareableHandle.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - Host specific (LINUX)
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemExportToShareableHandle_Positive_Basic") {
|
||||
HIP_CHECK(hipFree(0));
|
||||
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, 0));
|
||||
checkVMMSupported(device);
|
||||
|
||||
hipMemAllocationProp prop = {};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.requestedHandleTypes = hipMemHandleTypePosixFileDescriptor;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device;
|
||||
|
||||
size_t granularity;
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
HIP_CHECK(hipMemCreate(&handle, granularity * 2, &prop, 0));
|
||||
|
||||
void* shareable_handle = nullptr;
|
||||
HIP_CHECK(hipMemExportToShareableHandle(&shareable_handle, handle,
|
||||
hipMemHandleTypePosixFileDescriptor, 0));
|
||||
REQUIRE(shareable_handle != nullptr);
|
||||
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Negative parameters test.
|
||||
* ------------------------
|
||||
* - unit/virtualMemoryManagement/hipMemExportToShareableHandle.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - Host specific (LINUX)
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemExportToShareableHandle_Negative_Parameters") {
|
||||
HIP_CHECK(hipFree(0));
|
||||
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, 0));
|
||||
checkVMMSupported(device);
|
||||
|
||||
hipMemAllocationProp prop = {};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.requestedHandleTypes = hipMemHandleTypePosixFileDescriptor;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device;
|
||||
|
||||
size_t granularity;
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
HIP_CHECK(hipMemCreate(&handle, granularity * 2, &prop, 0));
|
||||
|
||||
void* shareable_handle = nullptr;
|
||||
|
||||
SECTION("shareableHandle == nullptr") {
|
||||
HIP_CHECK_ERROR(
|
||||
hipMemExportToShareableHandle(nullptr, handle, hipMemHandleTypePosixFileDescriptor, 0),
|
||||
hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
#if HT_AMD
|
||||
SECTION("handle == nullptr") {
|
||||
HIP_CHECK_ERROR(hipMemExportToShareableHandle(&shareable_handle, nullptr,
|
||||
hipMemHandleTypePosixFileDescriptor, 0),
|
||||
hipErrorInvalidValue);
|
||||
}
|
||||
#endif
|
||||
|
||||
SECTION("invalid handleType") {
|
||||
HIP_CHECK_ERROR(
|
||||
hipMemExportToShareableHandle(&shareable_handle, handle, hipMemHandleTypeWin32, 0),
|
||||
hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("non-zero flags") {
|
||||
HIP_CHECK_ERROR(hipMemExportToShareableHandle(&shareable_handle, handle,
|
||||
hipMemHandleTypePosixFileDescriptor, 1),
|
||||
hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
|
||||
#if HT_AMD // segfaults on NVIDIA
|
||||
SECTION("released handle") {
|
||||
HIP_CHECK_ERROR(hipMemExportToShareableHandle(&shareable_handle, handle,
|
||||
hipMemHandleTypePosixFileDescriptor, 0),
|
||||
hipErrorInvalidValue);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
+38
-33
@@ -23,7 +23,7 @@ THE SOFTWARE.
|
||||
/**
|
||||
* @addtogroup hipMemGetAllocationGranularity hipMemGetAllocationGranularity
|
||||
* @{
|
||||
* @ingroup MemoryTest
|
||||
* @ingroup VirtualMemoryManagementTest
|
||||
* `hipError_t hipMemGetAllocationGranularity (size_t* granularity,
|
||||
* const hipMemAllocationProp* prop,
|
||||
* hipMemAllocationGranularity_flags option)` -
|
||||
@@ -33,14 +33,13 @@ THE SOFTWARE.
|
||||
#include <hip_test_checkers.hh>
|
||||
#include <hip_test_kernels.hh>
|
||||
#include <hip_test_common.hh>
|
||||
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
/**
|
||||
local function to invoke hipMemGetAllocationGranularity.
|
||||
*/
|
||||
void getGranularity(size_t *granularity,
|
||||
hipMemAllocationGranularity_flags option,
|
||||
int device) {
|
||||
void getGranularity(size_t* granularity, hipMemAllocationGranularity_flags option, int device) {
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
@@ -54,16 +53,17 @@ void getGranularity(size_t *granularity,
|
||||
* - Functional Test to get granularity size for
|
||||
* hipMemAllocationGranularityMinimum option.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemGetAllocationGranularity.cc
|
||||
* - unit/virtualMemoryManagement/hipMemGetAllocationGranularity.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemGetAllocationGranularity_MinGranularity") {
|
||||
HIP_CHECK(hipFree(0));
|
||||
size_t granularity = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, 0));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
getGranularity(&granularity, hipMemAllocationGranularityMinimum, 0);
|
||||
REQUIRE(granularity > 0);
|
||||
}
|
||||
@@ -74,16 +74,17 @@ TEST_CASE("Unit_hipMemGetAllocationGranularity_MinGranularity") {
|
||||
* - Functional Test to get granularity size for
|
||||
* hipMemAllocationGranularityRecommended option.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemGetAllocationGranularity.cc
|
||||
* - unit/virtualMemoryManagement/hipMemGetAllocationGranularity.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemGetAllocationGranularity_RecommendedGranularity") {
|
||||
HIP_CHECK(hipFree(0));
|
||||
size_t granularity = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, 0));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
getGranularity(&granularity, hipMemAllocationGranularityRecommended, 0);
|
||||
REQUIRE(granularity > 0);
|
||||
}
|
||||
@@ -94,21 +95,21 @@ TEST_CASE("Unit_hipMemGetAllocationGranularity_RecommendedGranularity") {
|
||||
* - Functional Test to get granularity size for
|
||||
* hipMemAllocationGranularityMinimum option for all GPUs.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemGetAllocationGranularity.cc
|
||||
* - unit/virtualMemoryManagement/hipMemGetAllocationGranularity.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemGetAllocationGranularity_AllGPUs") {
|
||||
HIP_CHECK(hipFree(0));
|
||||
int numDevices = 0;
|
||||
HIP_CHECK(hipGetDeviceCount(&numDevices));
|
||||
for (int dev = 0; dev < numDevices; dev++) {
|
||||
size_t granularity = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, dev));
|
||||
checkVMMSupported(device)
|
||||
getGranularity(&granularity, hipMemAllocationGranularityRecommended,
|
||||
dev);
|
||||
checkVMMSupported(device);
|
||||
getGranularity(&granularity, hipMemAllocationGranularityRecommended, dev);
|
||||
REQUIRE(granularity > 0);
|
||||
}
|
||||
}
|
||||
@@ -118,16 +119,17 @@ TEST_CASE("Unit_hipMemGetAllocationGranularity_AllGPUs") {
|
||||
* ------------------------
|
||||
* - Negative Tests
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemGetAllocationGranularity.cc
|
||||
* - unit/virtualMemoryManagement/hipMemGetAllocationGranularity.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemGetAllocationGranularity_NegativeTests") {
|
||||
HIP_CHECK(hipFree(0));
|
||||
size_t granularity = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, 0));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
@@ -135,45 +137,48 @@ TEST_CASE("Unit_hipMemGetAllocationGranularity_NegativeTests") {
|
||||
|
||||
SECTION("Granularity is nullptr") {
|
||||
REQUIRE(hipErrorInvalidValue ==
|
||||
hipMemGetAllocationGranularity(nullptr, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(nullptr, &prop, hipMemAllocationGranularityMinimum));
|
||||
}
|
||||
#if HT_AMD // segfaults on NVIDIA
|
||||
SECTION("Prop is nullptr") {
|
||||
REQUIRE(hipErrorInvalidValue ==
|
||||
hipMemGetAllocationGranularity(&granularity, nullptr,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(
|
||||
hipErrorInvalidValue ==
|
||||
hipMemGetAllocationGranularity(&granularity, nullptr, hipMemAllocationGranularityMinimum));
|
||||
}
|
||||
#endif
|
||||
#if HT_NVIDIA
|
||||
SECTION("flag is invalid") {
|
||||
REQUIRE(hipErrorInvalidValue ==
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
(hipMemAllocationGranularity_flags)0xff));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
(hipMemAllocationGranularity_flags)0xff));
|
||||
}
|
||||
#endif
|
||||
#if HT_AMD // succeeds on NVIDIA
|
||||
SECTION("device id > highest device id") {
|
||||
int numDevices = 0;
|
||||
HIP_CHECK(hipGetDeviceCount(&numDevices));
|
||||
prop.location.id = numDevices; // set to non existing device
|
||||
REQUIRE(hipErrorInvalidValue ==
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(
|
||||
hipErrorInvalidValue ==
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
}
|
||||
SECTION("device id < lowest device id") {
|
||||
prop.location.id = -1; // set to non existing device
|
||||
REQUIRE(hipErrorInvalidValue ==
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(
|
||||
hipErrorInvalidValue ==
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
}
|
||||
SECTION("allocation type as invalid") {
|
||||
prop.type = hipMemAllocationTypeInvalid;
|
||||
REQUIRE(hipErrorInvalidValue ==
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(
|
||||
hipErrorInvalidValue ==
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
}
|
||||
SECTION("location type as invalid") {
|
||||
prop.location.type = hipMemLocationTypeInvalid;
|
||||
REQUIRE(hipErrorInvalidValue ==
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(
|
||||
hipErrorInvalidValue ==
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
+20
-22
@@ -20,26 +20,27 @@ OUT OF OR INN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <hip_test_common.hh>
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
#define DATA_SIZE (1 << 13)
|
||||
|
||||
/**
|
||||
* @addtogroup hipMemGetAllocationPropertiesFromHandle hipMemGetAllocationPropertiesFromHandle
|
||||
* @{
|
||||
* @ingroup MemoryTest
|
||||
* @ingroup VirtualMemoryManagementTest
|
||||
* `hipError_t hipMemGetAllocationPropertiesFromHandle(hipMemAllocationProp* prop,
|
||||
* hipMemGenericAllocationHandle_t handle)` -
|
||||
* Retrieve the property structure of the given handle.
|
||||
*/
|
||||
|
||||
#include <hip_test_common.hh>
|
||||
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
#define DATA_SIZE (1 << 13)
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Functional test to verify the values of hipMemAllocationProp properties.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemGetAllocationPropertiesFromHandle.cc
|
||||
* - unit/virtualMemoryManagement/hipMemGetAllocationPropertiesFromHandle.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -47,7 +48,7 @@ THE SOFTWARE.
|
||||
TEST_CASE("Unit_hipMemGetAllocationPropertiesFromHandle_functional") {
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, 0));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
hipMemAllocationProp prop = {};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
@@ -58,11 +59,10 @@ TEST_CASE("Unit_hipMemGetAllocationPropertiesFromHandle_functional") {
|
||||
size_t granularity = 0;
|
||||
int N = DATA_SIZE;
|
||||
size_t buffer_size = N * sizeof(int);
|
||||
HIP_CHECK(hipMemGetAllocationGranularity
|
||||
(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t mem_size = ((granularity + buffer_size - 1) / granularity)
|
||||
* granularity;
|
||||
size_t mem_size = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
// Allocate physical memory
|
||||
HIP_CHECK(hipMemCreate(&handle, mem_size, &prop, 0));
|
||||
// verify properties has been retrived from handle
|
||||
@@ -78,7 +78,7 @@ TEST_CASE("Unit_hipMemGetAllocationPropertiesFromHandle_functional") {
|
||||
* ------------------------
|
||||
* - Negative Tests.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemGetAllocationPropertiesFromHandle.cc
|
||||
* - unit/virtualMemoryManagement/hipMemGetAllocationPropertiesFromHandle.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -86,7 +86,7 @@ TEST_CASE("Unit_hipMemGetAllocationPropertiesFromHandle_functional") {
|
||||
TEST_CASE("Unit_hipMemGetAllocationPropertiesFromHandle_Negative") {
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, 0));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
hipMemAllocationProp prop = {};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
@@ -97,23 +97,21 @@ TEST_CASE("Unit_hipMemGetAllocationPropertiesFromHandle_Negative") {
|
||||
size_t granularity = 0;
|
||||
int N = DATA_SIZE;
|
||||
size_t buffer_size = N * sizeof(int);
|
||||
HIP_CHECK(hipMemGetAllocationGranularity
|
||||
(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t mem_size = ((granularity + buffer_size - 1) / granularity)
|
||||
* granularity;
|
||||
size_t mem_size = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
// Allocate physical memory
|
||||
HIP_CHECK(hipMemCreate(&handle, mem_size, &prop, 0));
|
||||
|
||||
SECTION("Nullptr as prop") {
|
||||
REQUIRE(hipMemGetAllocationPropertiesFromHandle(nullptr, handle)
|
||||
== hipErrorInvalidValue);
|
||||
REQUIRE(hipMemGetAllocationPropertiesFromHandle(nullptr, handle) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("null handle") {
|
||||
prop.location.type = hipMemLocationTypeInvalid;
|
||||
REQUIRE(hipMemGetAllocationPropertiesFromHandle(&prop_temp, nullptr)
|
||||
== hipErrorInvalidValue);
|
||||
REQUIRE(hipMemGetAllocationPropertiesFromHandle(&prop_temp, nullptr) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
}
|
||||
+210
@@ -0,0 +1,210 @@
|
||||
/*
|
||||
Copyright (c) 2023 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup hipMemExportToShareableHandle hipMemExportToShareableHandle
|
||||
* @{
|
||||
* @ingroup VirtualMemoryManagementTest
|
||||
* `hipError_t hipMemImportFromShareableHandle(hipMemGenericAllocationHandle_t *handle,
|
||||
* void *osHandle,
|
||||
* hipMemAllocationHandleType shHandleType)` -
|
||||
* Imports an allocation from a requested shareable handle type.
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include <hip_test_common.hh>
|
||||
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Basic sanity test.
|
||||
* ------------------------
|
||||
* - unit/virtualMemoryManagement/hipMemImportFromShareableHandle.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - Host specific (LINUX)
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemImportFromShareableHandle_Positive_Basic") {
|
||||
HIP_CHECK(hipFree(0));
|
||||
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, 0));
|
||||
checkVMMSupported(device);
|
||||
|
||||
hipMemAllocationProp prop = {};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.requestedHandleTypes = hipMemHandleTypePosixFileDescriptor;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device;
|
||||
|
||||
size_t granularity;
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
HIP_CHECK(hipMemCreate(&handle, granularity * 2, &prop, 0));
|
||||
|
||||
void* shareable_handle = nullptr;
|
||||
HIP_CHECK(hipMemExportToShareableHandle(&shareable_handle, handle,
|
||||
hipMemHandleTypePosixFileDescriptor, 0));
|
||||
|
||||
hipMemGenericAllocationHandle_t imported_handle;
|
||||
HIP_CHECK(hipMemImportFromShareableHandle(&imported_handle, shareable_handle,
|
||||
hipMemHandleTypePosixFileDescriptor));
|
||||
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Basic multiprocess sanity test.
|
||||
* ------------------------
|
||||
* - unit/virtualMemoryManagement/hipMemImportFromShareableHandle.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - Host specific (LINUX)
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemImportFromShareableHandle_Positive_MultiProc") {
|
||||
int fd[2];
|
||||
REQUIRE(pipe(fd) == 0);
|
||||
|
||||
auto pid = fork();
|
||||
REQUIRE(pid >= 0);
|
||||
|
||||
if (pid == 0) { // child
|
||||
REQUIRE(close(fd[1]) == 0);
|
||||
|
||||
void* shareable_handle = nullptr;
|
||||
REQUIRE(read(fd[0], &shareable_handle, sizeof(shareable_handle)) >= 0);
|
||||
REQUIRE(close(fd[0]) == 0);
|
||||
|
||||
REQUIRE(shareable_handle != nullptr);
|
||||
|
||||
HIP_CHECK(hipFree(0));
|
||||
|
||||
hipMemGenericAllocationHandle_t imported_handle;
|
||||
HIP_CHECK(hipMemImportFromShareableHandle(&imported_handle, shareable_handle,
|
||||
hipMemHandleTypePosixFileDescriptor));
|
||||
|
||||
exit(0);
|
||||
} else { // parent
|
||||
REQUIRE(close(fd[0]) == 0);
|
||||
|
||||
HIP_CHECK(hipFree(0));
|
||||
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, 0));
|
||||
checkVMMSupported(device);
|
||||
|
||||
hipMemAllocationProp prop = {};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.requestedHandleTypes = hipMemHandleTypePosixFileDescriptor;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device;
|
||||
|
||||
size_t granularity;
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
HIP_CHECK(hipMemCreate(&handle, granularity * 2, &prop, 0));
|
||||
|
||||
void* shareable_handle = nullptr;
|
||||
HIP_CHECK(hipMemExportToShareableHandle(&shareable_handle, handle,
|
||||
hipMemHandleTypePosixFileDescriptor, 0));
|
||||
|
||||
REQUIRE(write(fd[1], &shareable_handle, sizeof(shareable_handle)) >= 0);
|
||||
REQUIRE(close(fd[1]) == 0);
|
||||
|
||||
REQUIRE(wait(NULL) >= 0);
|
||||
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Negative parameters test.
|
||||
* ------------------------
|
||||
* - unit/virtualMemoryManagement/hipMemImportFromShareableHandle.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - Host specific (LINUX)
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemImportFromShareableHandle_Negative_Parameters") {
|
||||
HIP_CHECK(hipFree(0));
|
||||
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, 0));
|
||||
checkVMMSupported(device);
|
||||
|
||||
hipMemAllocationProp prop = {};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.requestedHandleTypes = hipMemHandleTypePosixFileDescriptor;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device;
|
||||
|
||||
size_t granularity;
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
HIP_CHECK(hipMemCreate(&handle, granularity * 2, &prop, 0));
|
||||
|
||||
void* shareable_handle = nullptr;
|
||||
HIP_CHECK(hipMemExportToShareableHandle(&shareable_handle, handle,
|
||||
hipMemHandleTypePosixFileDescriptor, 0));
|
||||
|
||||
hipMemGenericAllocationHandle_t imported_handle;
|
||||
|
||||
#if HT_AMD
|
||||
SECTION("handle == nullptr") {
|
||||
HIP_CHECK_ERROR(hipMemImportFromShareableHandle(nullptr, shareable_handle,
|
||||
hipMemHandleTypePosixFileDescriptor),
|
||||
hipErrorInvalidValue);
|
||||
}
|
||||
#endif
|
||||
|
||||
SECTION("shareableHandle == nullptr") {
|
||||
HIP_CHECK_ERROR(hipMemImportFromShareableHandle(&imported_handle, nullptr,
|
||||
hipMemHandleTypePosixFileDescriptor),
|
||||
hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("invalid handleType") {
|
||||
HIP_CHECK_ERROR(
|
||||
hipMemImportFromShareableHandle(&imported_handle, shareable_handle, hipMemHandleTypeWin32),
|
||||
hipErrorNotSupported);
|
||||
}
|
||||
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
}
|
||||
+54
-72
@@ -19,10 +19,11 @@ LIABILITY, WHETHER INN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR INN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup hipMemMap hipMemMap
|
||||
* @{
|
||||
* @ingroup MemoryTest
|
||||
* @ingroup VirtualMemoryManagementTest
|
||||
* `hipError_t hipMemMap (void* ptr,
|
||||
* size_t size,
|
||||
* size_t offset,
|
||||
@@ -32,6 +33,7 @@ THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <hip_test_common.hh>
|
||||
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
constexpr int N = (1 << 13);
|
||||
@@ -45,7 +47,7 @@ constexpr int initializer = 0;
|
||||
* vmm address range repeatedly. This test validates physical memory
|
||||
* euse using same vmm range.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemMap.cc
|
||||
* - unit/virtualMemoryManagement/hipMemMap.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -57,24 +59,22 @@ TEST_CASE("Unit_hipMemMap_SameMemoryReuse") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
// Allocate host memory and intialize data
|
||||
std::vector<int> A_h(N), B_h(N), C_h(N);
|
||||
// Initialize with data
|
||||
for (size_t idx = 0; idx < N; idx++) {
|
||||
A_h[idx] = idx;
|
||||
C_h[idx] = idx*idx;
|
||||
C_h[idx] = idx * idx;
|
||||
}
|
||||
// Allocate a physical memory chunk
|
||||
HIP_CHECK(hipMemCreate(&handle, size_mem, &prop, 0));
|
||||
@@ -94,8 +94,7 @@ TEST_CASE("Unit_hipMemMap_SameMemoryReuse") {
|
||||
HIP_CHECK(hipMemcpyDtoH(B_h.data(), ptrA, buffer_size));
|
||||
REQUIRE(true == std::equal(B_h.begin(), B_h.end(), A_h.data()));
|
||||
#if HT_NVIDIA
|
||||
square_kernel <<<dim3(N / threadsPerBlk), dim3(threadsPerBlk), 0, 0>>>(
|
||||
static_cast<int*>(ptrA));
|
||||
square_kernel<<<dim3(N / threadsPerBlk), dim3(threadsPerBlk), 0, 0>>>(static_cast<int*>(ptrA));
|
||||
HIP_CHECK(hipMemcpyDtoH(B_h.data(), ptrA, buffer_size));
|
||||
HIP_CHECK(hipStreamSynchronize(0));
|
||||
REQUIRE(true == std::equal(B_h.begin(), B_h.end(), C_h.data()));
|
||||
@@ -114,7 +113,7 @@ TEST_CASE("Unit_hipMemMap_SameMemoryReuse") {
|
||||
* vmm addresses. This test validates physical memory reuse using
|
||||
* different vmm ranges.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemMap.cc
|
||||
* - unit/virtualMemoryManagement/hipMemMap.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -125,24 +124,22 @@ TEST_CASE("Unit_hipMemMap_PhysicalMemoryReuse_SingleGPU") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
// Allocate host memory and intialize data
|
||||
std::vector<int> A_h(N), B_h(N), C_h(N);
|
||||
// Initialize with data
|
||||
for (size_t idx = 0; idx < N; idx++) {
|
||||
A_h[idx] = idx;
|
||||
C_h[idx] = idx*idx;
|
||||
C_h[idx] = idx * idx;
|
||||
}
|
||||
// Allocate a physical memory chunk
|
||||
HIP_CHECK(hipMemCreate(&handle, size_mem, &prop, 0));
|
||||
@@ -164,8 +161,8 @@ TEST_CASE("Unit_hipMemMap_PhysicalMemoryReuse_SingleGPU") {
|
||||
HIP_CHECK(hipMemcpyDtoH(B_h.data(), ptrA[buf], buffer_size));
|
||||
REQUIRE(true == std::equal(B_h.begin(), B_h.end(), A_h.data()));
|
||||
#if HT_NVIDIA
|
||||
square_kernel <<<dim3(N / threadsPerBlk), dim3(threadsPerBlk), 0, 0>>>(
|
||||
static_cast<int*>(ptrA[buf]));
|
||||
square_kernel<<<dim3(N / threadsPerBlk), dim3(threadsPerBlk), 0, 0>>>(
|
||||
static_cast<int*>(ptrA[buf]));
|
||||
HIP_CHECK(hipMemcpyDtoH(B_h.data(), ptrA[buf], buffer_size));
|
||||
HIP_CHECK(hipStreamSynchronize(0));
|
||||
REQUIRE(true == std::equal(B_h.begin(), B_h.end(), C_h.data()));
|
||||
@@ -186,7 +183,7 @@ TEST_CASE("Unit_hipMemMap_PhysicalMemoryReuse_SingleGPU") {
|
||||
* vmm addresses at the same time and check data values integrity
|
||||
* between different VMMs.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemMap.cc
|
||||
* - unit/virtualMemoryManagement/hipMemMap.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -197,17 +194,15 @@ TEST_CASE("Unit_hipMemMap_PhysicalMemory_Map2MultVMMs") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
// Allocate host memory and intialize data
|
||||
std::vector<int> A_h(N), B_h(N);
|
||||
@@ -253,7 +248,7 @@ TEST_CASE("Unit_hipMemMap_PhysicalMemory_Map2MultVMMs") {
|
||||
* multiple vmm addresses. This test validates physical memory
|
||||
* reuse using different vmm ranges on multiple devices.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemMap.cc
|
||||
* - unit/virtualMemoryManagement/hipMemMap.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -270,17 +265,15 @@ TEST_CASE("Unit_hipMemMap_PhysicalMemoryReuse_MultiDev") {
|
||||
for (int devX = 0; devX < devicecount; devX++) {
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, devX));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
// Allocate host memory and intialize data
|
||||
std::vector<int> A_h(N), B_h(N);
|
||||
@@ -328,7 +321,7 @@ TEST_CASE("Unit_hipMemMap_PhysicalMemoryReuse_MultiDev") {
|
||||
* for single vmm address. This test validates VMM memory reuse
|
||||
* using different physical ranges.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemMap.cc
|
||||
* - unit/virtualMemoryManagement/hipMemMap.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -339,24 +332,22 @@ TEST_CASE("Unit_hipMemMap_VMMMemoryReuse_SingleGPU") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle[num_buf];
|
||||
// Allocate host memory and intialize data
|
||||
std::vector<int> A_h(N), B_h(N), C_h(N);
|
||||
// Initialize with data
|
||||
for (size_t idx = 0; idx < N; idx++) {
|
||||
A_h[idx] = idx;
|
||||
C_h[idx] = idx*idx;
|
||||
C_h[idx] = idx * idx;
|
||||
}
|
||||
// Allocate a physical memory chunk
|
||||
for (int buf = 0; buf < num_buf; buf++) {
|
||||
@@ -379,8 +370,7 @@ TEST_CASE("Unit_hipMemMap_VMMMemoryReuse_SingleGPU") {
|
||||
HIP_CHECK(hipMemcpyDtoH(B_h.data(), ptrA, buffer_size));
|
||||
REQUIRE(true == std::equal(B_h.begin(), B_h.end(), A_h.data()));
|
||||
#if HT_NVIDIA
|
||||
square_kernel <<<dim3(N / threadsPerBlk), dim3(threadsPerBlk), 0, 0>>>(
|
||||
static_cast<int*>(ptrA));
|
||||
square_kernel<<<dim3(N / threadsPerBlk), dim3(threadsPerBlk), 0, 0>>>(static_cast<int*>(ptrA));
|
||||
HIP_CHECK(hipMemcpyDtoH(B_h.data(), ptrA, buffer_size));
|
||||
HIP_CHECK(hipStreamSynchronize(0));
|
||||
REQUIRE(true == std::equal(B_h.begin(), B_h.end(), C_h.data()));
|
||||
@@ -401,7 +391,7 @@ TEST_CASE("Unit_hipMemMap_VMMMemoryReuse_SingleGPU") {
|
||||
* can be mapped/unmapped to single vmm address. This test validates VMM
|
||||
* memory reuse using different physical ranges.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemMap.cc
|
||||
* - unit/virtualMemoryManagement/hipMemMap.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -417,17 +407,15 @@ TEST_CASE("Unit_hipMemMap_VMMMemoryReuse_MultiGPU") {
|
||||
size_t buffer_size = N * sizeof(int);
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
std::vector<hipMemGenericAllocationHandle_t> handle(devicecount);
|
||||
// Allocate host memory and intialize data
|
||||
std::vector<int> A_h(N), B_h(N);
|
||||
@@ -493,7 +481,7 @@ TEST_CASE("Unit_hipMemMap_VMMMemoryReuse_MultiGPU") {
|
||||
* - Check if a partial part of a physical chunk can be mapped/unmapped
|
||||
* to a smaller vmm address.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemMap.cc
|
||||
* - unit/virtualMemoryManagement/hipMemMap.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -504,17 +492,15 @@ TEST_CASE("Unit_hipMemMap_MapPartialPhysicalMem") {
|
||||
size_t buffer_size = N * sizeof(int);
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
// Allocate host memory and intialize data
|
||||
std::vector<int> A_h(N), B_h(N);
|
||||
@@ -523,7 +509,7 @@ TEST_CASE("Unit_hipMemMap_MapPartialPhysicalMem") {
|
||||
A_h[idx] = idx;
|
||||
}
|
||||
// Allocate a bigger physical memory chunk of twice size_mem
|
||||
HIP_CHECK(hipMemCreate(&handle, 2*size_mem, &prop, 0));
|
||||
HIP_CHECK(hipMemCreate(&handle, 2 * size_mem, &prop, 0));
|
||||
// Allocate virtual address range of size size_mem
|
||||
hipDeviceptr_t ptrA;
|
||||
HIP_CHECK(hipMemAddressReserve(&ptrA, size_mem, 0, 0, 0));
|
||||
@@ -549,7 +535,7 @@ TEST_CASE("Unit_hipMemMap_MapPartialPhysicalMem") {
|
||||
* - Check if a partial part of a VMM range can be mapped/unmapped
|
||||
* to a physical address.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemMap.cc
|
||||
* - unit/virtualMemoryManagement/hipMemMap.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -560,17 +546,15 @@ TEST_CASE("Unit_hipMemMap_MapPartialVMMMem") {
|
||||
size_t buffer_size = N * sizeof(int);
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
// Allocate host memory and intialize data
|
||||
std::vector<int> A_h(N), B_h(N);
|
||||
@@ -582,13 +566,13 @@ TEST_CASE("Unit_hipMemMap_MapPartialVMMMem") {
|
||||
HIP_CHECK(hipMemCreate(&handle, size_mem, &prop, 0));
|
||||
// Allocate virtual address range of size twice size_mem
|
||||
hipDeviceptr_t ptrA;
|
||||
HIP_CHECK(hipMemAddressReserve(&ptrA, 2*size_mem, 0, 0, 0));
|
||||
HIP_CHECK(hipMemAddressReserve(&ptrA, 2 * size_mem, 0, 0, 0));
|
||||
hipMemAccessDesc accessDesc = {};
|
||||
accessDesc.location.type = hipMemLocationTypeDevice;
|
||||
accessDesc.location.id = device;
|
||||
accessDesc.flags = hipMemAccessFlagsProtReadWrite;
|
||||
std::fill(B_h.begin(), B_h.end(), initializer);
|
||||
HIP_CHECK(hipMemMap(ptrA , size_mem, 0, handle, 0));
|
||||
HIP_CHECK(hipMemMap(ptrA, size_mem, 0, handle, 0));
|
||||
HIP_CHECK(hipMemSetAccess(ptrA, size_mem, &accessDesc, 1));
|
||||
HIP_CHECK(hipMemcpyHtoD(ptrA, A_h.data(), buffer_size));
|
||||
HIP_CHECK(hipMemcpyDtoH(B_h.data(), ptrA, buffer_size));
|
||||
@@ -596,7 +580,7 @@ TEST_CASE("Unit_hipMemMap_MapPartialVMMMem") {
|
||||
HIP_CHECK(hipMemUnmap(ptrA, size_mem));
|
||||
// Release resources
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
HIP_CHECK(hipMemAddressFree(ptrA, 2*size_mem));
|
||||
HIP_CHECK(hipMemAddressFree(ptrA, 2 * size_mem));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -604,7 +588,7 @@ TEST_CASE("Unit_hipMemMap_MapPartialVMMMem") {
|
||||
* ------------------------
|
||||
* - Negative Argument Tests
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemMap.cc
|
||||
* - unit/virtualMemoryManagement/hipMemMap.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -615,16 +599,15 @@ TEST_CASE("Unit_hipMemMap_negative") {
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
hipDeviceptr_t ptrA;
|
||||
// Allocate physical memory
|
||||
@@ -633,8 +616,7 @@ TEST_CASE("Unit_hipMemMap_negative") {
|
||||
HIP_CHECK(hipMemAddressReserve(&ptrA, size_mem, 0, 0, 0));
|
||||
|
||||
SECTION("nullptr to ptrA") {
|
||||
REQUIRE(hipMemMap(nullptr, size_mem, 0, handle, 0) ==
|
||||
hipErrorInvalidValue);
|
||||
REQUIRE(hipMemMap(nullptr, size_mem, 0, handle, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("pass zero to size") {
|
||||
@@ -642,9 +624,9 @@ TEST_CASE("Unit_hipMemMap_negative") {
|
||||
}
|
||||
|
||||
SECTION("pass negative to offset") {
|
||||
REQUIRE(hipMemMap(&ptrA, size_mem, -1, handle, 0) ==
|
||||
hipErrorInvalidValue);
|
||||
REQUIRE(hipMemMap(&ptrA, size_mem, -1, handle, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
HIP_CHECK(hipMemAddressFree(ptrA, size_mem));
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
Copyright (c) 2023 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup hipMemMapArrayAsync hipMemMapArrayAsync
|
||||
* @{
|
||||
* @ingroup VirtualMemoryManagementTest
|
||||
* `hipError_t hipMemMapArrayAsync(hipArrayMapInfo *mapInfoList,
|
||||
* unsigned int count,
|
||||
* hipStream_t stream)` -
|
||||
* Maps or unmaps subregions of sparse HIP arrays and sparse HIP mipmapped arrays.
|
||||
*/
|
||||
|
||||
#include <hip_array_common.hh>
|
||||
#include <hip_test_common.hh>
|
||||
#include <resource_guards.hh>
|
||||
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Basic sanity test.
|
||||
* ------------------------
|
||||
* - unit/virtualMemoryManagement/hipMemMapArrayAsync.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemMapArrayAsync_Positive_Basic") {
|
||||
HIP_CHECK(hipFree(0));
|
||||
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, 0));
|
||||
checkVMMSupported(device);
|
||||
|
||||
CHECK_IMAGE_SUPPORT;
|
||||
|
||||
hipmipmappedArray array;
|
||||
|
||||
HIP_ARRAY3D_DESCRIPTOR desc = {};
|
||||
using vec_info = vector_info<float>;
|
||||
desc.Format = vec_info::format;
|
||||
desc.NumChannels = vec_info::size;
|
||||
desc.Width = 1;
|
||||
desc.Height = 1;
|
||||
desc.Flags = CUDA_ARRAY3D_SPARSE;
|
||||
|
||||
unsigned int levels = 2;
|
||||
|
||||
HIP_CHECK(hipMipmappedArrayCreate(&array, &desc, levels));
|
||||
|
||||
hipMemAllocationProp prop = {};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device;
|
||||
prop.allocFlags.usage = CU_MEM_CREATE_USAGE_TILE_POOL;
|
||||
|
||||
size_t granularity;
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityRecommended));
|
||||
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
HIP_CHECK(hipMemCreate(&handle, granularity, &prop, 0));
|
||||
|
||||
hipArrayMapInfo map_info_list = {};
|
||||
map_info_list.resourceType = HIP_RESOURCE_TYPE_MIPMAPPED_ARRAY;
|
||||
map_info_list.resource.mipmap = array;
|
||||
map_info_list.subresourceType = hipArraySparseSubresourceTypeSparseLevel;
|
||||
map_info_list.subresource.sparseLevel.extentWidth = 1;
|
||||
map_info_list.subresource.sparseLevel.extentHeight = 1;
|
||||
map_info_list.subresource.sparseLevel.extentDepth = 1;
|
||||
map_info_list.memOperationType = hipMemOperationTypeMap;
|
||||
map_info_list.memHandleType = hipMemHandleTypeGeneric;
|
||||
map_info_list.memHandle.memHandle = handle;
|
||||
map_info_list.deviceBitMask = 0x1;
|
||||
|
||||
StreamGuard stream(Streams::created);
|
||||
|
||||
HIP_CHECK(hipMemMapArrayAsync(&map_info_list, 1, stream.stream()));
|
||||
HIP_CHECK(hipStreamSynchronize(stream.stream()));
|
||||
|
||||
map_info_list.memOperationType = hipMemOperationTypeUnmap;
|
||||
map_info_list.memHandle.memHandle = NULL;
|
||||
HIP_CHECK(hipMemMapArrayAsync(&map_info_list, 1, stream.stream()));
|
||||
HIP_CHECK(hipStreamSynchronize(stream.stream()));
|
||||
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
|
||||
HIP_CHECK(hipMipmappedArrayDestroy(array));
|
||||
}
|
||||
+3
-5
@@ -23,7 +23,7 @@ THE SOFTWARE.
|
||||
/**
|
||||
* @addtogroup hipMemRelease hipMemRelease
|
||||
* @{
|
||||
* @ingroup MemoryTest
|
||||
* @ingroup VirtualMemoryManagementTest
|
||||
* `hipMemRelease(hipMemGenericAllocationHandle_t handle)` -
|
||||
* Release a memory handle representing a memory allocation which was previously
|
||||
* allocated through hipMemCreate.
|
||||
@@ -36,13 +36,11 @@ THE SOFTWARE.
|
||||
* ------------------------
|
||||
* - Negative Tests
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemRelease.cc
|
||||
* - unit/virtualMemoryManagement/hipMemRelease.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemRelease_negative") {
|
||||
SECTION("Nullptr to handle") {
|
||||
REQUIRE(hipMemRelease(nullptr) == hipErrorInvalidValue);
|
||||
}
|
||||
SECTION("Nullptr to handle") { REQUIRE(hipMemRelease(nullptr) == hipErrorInvalidValue); }
|
||||
}
|
||||
+24
-27
@@ -23,7 +23,7 @@ THE SOFTWARE.
|
||||
/**
|
||||
* @addtogroup hipMemRetainAllocationHandle hipMemRetainAllocationHandle
|
||||
* @{
|
||||
* @ingroup MemoryTest
|
||||
* @ingroup VirtualMemoryManagementTest
|
||||
* `hipError_t hipMemRetainAllocationHandle(hipMemGenericAllocationHandle_t* handle,
|
||||
* void* addr)` -
|
||||
* Returns the allocation handle of the backing memory allocation given the address.
|
||||
@@ -31,6 +31,7 @@ THE SOFTWARE.
|
||||
|
||||
#include <hip_test_kernels.hh>
|
||||
#include <hip_test_common.hh>
|
||||
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
#define DATA_SIZE (1 << 13)
|
||||
@@ -41,41 +42,39 @@ THE SOFTWARE.
|
||||
* - Create a VM mapped to physical memory. Input addr to
|
||||
* hipMemRetainAllocationHandle and validate the handle.
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemRetainAllocationHandle.cc
|
||||
* - unit/virtualMemoryManagement/hipMemRetainAllocationHandle.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemRetainAllocationHandle_SetGet") {
|
||||
HIP_CHECK(hipFree(0));
|
||||
size_t granularity = 0;
|
||||
constexpr int N = DATA_SIZE;
|
||||
size_t buffer_size = N * sizeof(int);
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
hipDeviceptr_t ptrA;
|
||||
// Allocate physical memory
|
||||
HIP_CHECK(hipMemCreate(&handle, size_mem, &prop, 0));
|
||||
// Allocate virtual address range
|
||||
HIP_CHECK(hipMemAddressReserve(&ptrA, size_mem,
|
||||
0, 0, 0));
|
||||
HIP_CHECK(hipMemAddressReserve(&ptrA, size_mem, 0, 0, 0));
|
||||
HIP_CHECK(hipMemMap(ptrA, size_mem, 0, handle, 0));
|
||||
// Test hipMemRetainAllocationHandle
|
||||
hipMemGenericAllocationHandle_t gethandle;
|
||||
// Check beginning of VMM ptr
|
||||
HIP_CHECK(hipMemRetainAllocationHandle(&gethandle,
|
||||
reinterpret_cast<void*>(ptrA)));
|
||||
HIP_CHECK(hipMemRetainAllocationHandle(&gethandle, reinterpret_cast<void*>(ptrA)));
|
||||
REQUIRE(gethandle == handle);
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
HIP_CHECK(hipMemUnmap(ptrA, size_mem));
|
||||
@@ -87,58 +86,56 @@ TEST_CASE("Unit_hipMemRetainAllocationHandle_SetGet") {
|
||||
* ------------------------
|
||||
* - Negative Tests
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemRetainAllocationHandle.cc
|
||||
* - unit/virtualMemoryManagement/hipMemRetainAllocationHandle.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
*/
|
||||
TEST_CASE("Unit_hipMemRetainAllocationHandle_NegTst") {
|
||||
HIP_CHECK(hipFree(0));
|
||||
size_t granularity = 0;
|
||||
constexpr int N = DATA_SIZE;
|
||||
size_t buffer_size = N * sizeof(int);
|
||||
int deviceId = 0;
|
||||
hipDevice_t device;
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
HIP_CHECK(hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
hipDeviceptr_t ptrA;
|
||||
// Allocate physical memory
|
||||
HIP_CHECK(hipMemCreate(&handle, size_mem, &prop, 0));
|
||||
// Allocate virtual address range
|
||||
HIP_CHECK(hipMemAddressReserve(&ptrA, size_mem,
|
||||
0, 0, 0));
|
||||
HIP_CHECK(hipMemAddressReserve(&ptrA, size_mem, 0, 0, 0));
|
||||
HIP_CHECK(hipMemMap(ptrA, size_mem, 0, handle, 0));
|
||||
// Test hipMemRetainAllocationHandle
|
||||
hipMemGenericAllocationHandle_t gethandle;
|
||||
SECTION("nullptr handle") {
|
||||
REQUIRE(hipMemRetainAllocationHandle(nullptr,
|
||||
reinterpret_cast<void*>(ptrA)) == hipErrorInvalidValue);
|
||||
REQUIRE(hipMemRetainAllocationHandle(nullptr, reinterpret_cast<void*>(ptrA)) ==
|
||||
hipErrorInvalidValue);
|
||||
}
|
||||
SECTION("nullptr Vmm ptr") {
|
||||
REQUIRE(hipMemRetainAllocationHandle(&gethandle, nullptr) ==
|
||||
hipErrorInvalidValue);
|
||||
REQUIRE(hipMemRetainAllocationHandle(&gethandle, nullptr) == hipErrorInvalidValue);
|
||||
}
|
||||
SECTION("not mapped address") {
|
||||
hipDeviceptr_t ptrB;
|
||||
HIP_CHECK(hipMemAddressReserve(&ptrB, size_mem, 0, 0, 0));
|
||||
REQUIRE(hipMemRetainAllocationHandle(&gethandle,
|
||||
reinterpret_cast<void*>(ptrB)) == hipErrorInvalidValue);
|
||||
REQUIRE(hipMemRetainAllocationHandle(&gethandle, reinterpret_cast<void*>(ptrB)) ==
|
||||
hipErrorInvalidValue);
|
||||
HIP_CHECK(hipMemAddressFree(ptrB, size_mem));
|
||||
}
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
HIP_CHECK(hipMemUnmap(ptrA, size_mem));
|
||||
SECTION("unmapped address") {
|
||||
REQUIRE(hipMemRetainAllocationHandle(&gethandle,
|
||||
reinterpret_cast<void*>(ptrA)) == hipErrorInvalidValue);
|
||||
REQUIRE(hipMemRetainAllocationHandle(&gethandle, reinterpret_cast<void*>(ptrA)) ==
|
||||
hipErrorInvalidValue);
|
||||
}
|
||||
HIP_CHECK(hipMemAddressFree(ptrA, size_mem));
|
||||
}
|
||||
+203
-253
File diff suppressed because it is too large
Load Diff
+13
-13
@@ -23,22 +23,24 @@ THE SOFTWARE.
|
||||
/**
|
||||
* @addtogroup hipMemUnmap hipMemUnmap
|
||||
* @{
|
||||
* @ingroup MemoryTest
|
||||
* @ingroup VirtualMemoryManagementTest
|
||||
* `hipError_t hipMemUnmap (void* ptr, size_t size)` -
|
||||
* Unmap memory allocation of a given address range.
|
||||
*/
|
||||
|
||||
|
||||
#include <hip_test_common.hh>
|
||||
|
||||
#include "hip_vmm_common.hh"
|
||||
|
||||
constexpr int N = (1 << 13);
|
||||
|
||||
/**
|
||||
* Test Description
|
||||
* ------------------------
|
||||
* - Negative Tests
|
||||
* ------------------------
|
||||
* - catch\unit\memory\hipMemUnmap.cc
|
||||
* - unit/virtualMemoryManagement/hipMemUnmap.cc
|
||||
* Test requirements
|
||||
* ------------------------
|
||||
* - HIP_VERSION >= 6.1
|
||||
@@ -50,18 +52,17 @@ TEST_CASE("Unit_hipMemUnmap_negative") {
|
||||
hipDevice_t device;
|
||||
|
||||
HIP_CHECK(hipDeviceGet(&device, deviceId));
|
||||
checkVMMSupported(device)
|
||||
checkVMMSupported(device);
|
||||
|
||||
hipMemAllocationProp prop{};
|
||||
prop.type = hipMemAllocationTypePinned;
|
||||
prop.location.type = hipMemLocationTypeDevice;
|
||||
prop.location.id = device; // Current Devices
|
||||
|
||||
HIP_CHECK(hipMemGetAllocationGranularity(&granularity, &prop,
|
||||
hipMemAllocationGranularityMinimum));
|
||||
HIP_CHECK(
|
||||
hipMemGetAllocationGranularity(&granularity, &prop, hipMemAllocationGranularityMinimum));
|
||||
REQUIRE(granularity > 0);
|
||||
size_t size_mem =
|
||||
((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
size_t size_mem = ((granularity + buffer_size - 1) / granularity) * granularity;
|
||||
|
||||
hipMemGenericAllocationHandle_t handle;
|
||||
hipDeviceptr_t ptrA;
|
||||
@@ -70,18 +71,17 @@ TEST_CASE("Unit_hipMemUnmap_negative") {
|
||||
// Allocate virtual address range
|
||||
HIP_CHECK(hipMemAddressReserve(&ptrA, size_mem, 0, 0, 0));
|
||||
HIP_CHECK(hipMemMap(ptrA, size_mem, 0, handle, 0));
|
||||
SECTION("nullptr to ptrA") {
|
||||
REQUIRE(hipMemUnmap(nullptr, size_mem) == hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
SECTION("pass zero to size") {
|
||||
REQUIRE(hipMemUnmap(ptrA, 0) == hipErrorInvalidValue);
|
||||
}
|
||||
SECTION("nullptr to ptrA") { REQUIRE(hipMemUnmap(nullptr, size_mem) == hipErrorInvalidValue); }
|
||||
|
||||
SECTION("pass zero to size") { REQUIRE(hipMemUnmap(ptrA, 0) == hipErrorInvalidValue); }
|
||||
|
||||
#if HT_NVIDIA
|
||||
SECTION("unmap a smaller size") {
|
||||
REQUIRE(hipMemUnmap(ptrA, (size_mem - 1)) == hipErrorInvalidValue);
|
||||
}
|
||||
#endif
|
||||
|
||||
HIP_CHECK(hipMemRelease(handle));
|
||||
HIP_CHECK(hipMemUnmap(ptrA, size_mem));
|
||||
HIP_CHECK(hipMemAddressFree(ptrA, size_mem));
|
||||
+30
-25
@@ -1,30 +1,30 @@
|
||||
/*
|
||||
Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANNTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INNCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANNY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER INN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR INN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANNTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER INN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR INN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/* Test Case Description:
|
||||
1) This testcase verifies the basic scenario - supported on
|
||||
all devices
|
||||
*/
|
||||
|
||||
#include <hip_test_common.hh>
|
||||
#include <hip_test_kernels.hh>
|
||||
#include <hip_test_checkers.hh>
|
||||
#include <cstdio>
|
||||
#include <cstdint>
|
||||
#include <algorithm>
|
||||
@@ -32,6 +32,10 @@
|
||||
#include <chrono>
|
||||
#include <vector>
|
||||
|
||||
#include <hip_test_common.hh>
|
||||
#include <hip_test_kernels.hh>
|
||||
#include <hip_test_checkers.hh>
|
||||
|
||||
/*
|
||||
This testcase verifies HIP Mem VMM API basic scenario - supported on all devices
|
||||
*/
|
||||
@@ -42,8 +46,9 @@ TEST_CASE("Unit_hipMemVmm_Basic") {
|
||||
INFO("hipDeviceAttributeVirtualMemoryManagementSupported: " << vmm);
|
||||
|
||||
if (vmm == 0) {
|
||||
SUCCEED("GPU 0 doesn't support hipDeviceAttributeVirtualMemoryManagement "
|
||||
"attribute. Hence skipping the testing with Pass result.\n");
|
||||
SUCCEED(
|
||||
"GPU 0 doesn't support hipDeviceAttributeVirtualMemoryManagement "
|
||||
"attribute. Hence skipping the testing with Pass result.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -54,7 +59,8 @@ TEST_CASE("Unit_hipMemVmm_Basic") {
|
||||
memAllocationProp.location.id = 0;
|
||||
memAllocationProp.location.type = hipMemLocationTypeDevice;
|
||||
|
||||
HIP_CHECK(hipMemGetAllocationGranularity(&granularity, &memAllocationProp, hipMemAllocationGranularityRecommended));
|
||||
HIP_CHECK(hipMemGetAllocationGranularity(&granularity, &memAllocationProp,
|
||||
hipMemAllocationGranularityRecommended));
|
||||
|
||||
size_t size = 4 * 1024;
|
||||
void* reservedAddress{nullptr};
|
||||
@@ -78,7 +84,7 @@ TEST_CASE("Unit_hipMemVmm_Basic") {
|
||||
HIP_CHECK(hipMemset(reservedAddress, value, size));
|
||||
HIP_CHECK(hipMemcpy(&values[0], reservedAddress, size, hipMemcpyDeviceToHost));
|
||||
|
||||
for (size_t i=0; i < size; ++i) {
|
||||
for (size_t i = 0; i < size; ++i) {
|
||||
REQUIRE(values[i] == value);
|
||||
}
|
||||
|
||||
@@ -87,4 +93,3 @@ TEST_CASE("Unit_hipMemVmm_Basic") {
|
||||
HIP_CHECK(hipMemRelease(gaHandle));
|
||||
HIP_CHECK(hipMemAddressFree(reservedAddress, size));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
Copyright (c) 2023 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "hip_test_context.hh"
|
||||
|
||||
#define checkVMMSupported(device) \
|
||||
{ \
|
||||
int value = 0; \
|
||||
hipDeviceAttribute_t attr = hipDeviceAttributeVirtualMemoryManagementSupported; \
|
||||
HIP_CHECK(hipDeviceGetAttribute(&value, attr, device)); \
|
||||
if (value == 0) { \
|
||||
HipTest::HIP_SKIP_TEST("Machine does not support VMM. Skipping Test.."); \
|
||||
return; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define checkVMMSupportedRetVal(device) \
|
||||
{ \
|
||||
int value = 0; \
|
||||
hipDeviceAttribute_t attr = hipDeviceAttributeVirtualMemoryManagementSupported; \
|
||||
HIP_CHECK(hipDeviceGetAttribute(&value, attr, device)); \
|
||||
if (value == 0) { \
|
||||
HipTest::HIP_SKIP_TEST("Machine does not support VMM. Skipping Test.."); \
|
||||
return true; \
|
||||
} \
|
||||
}
|
||||
|
||||
constexpr int threadsPerBlk = 64;
|
||||
Reference in New Issue
Block a user