From f4ef7cc04f64bf6496b37a76e464fa743e097efa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio?= Date: Wed, 3 Aug 2022 12:19:49 +0100 Subject: [PATCH] EXSWCPHIPT-123: Added testing for hipDeviceGetP2PAttribute (#2840) [ROCm/hip commit: c435fd5c473691f3116f7612ae4ffd3f4957aae7] --- .../tests/catch/unit/device/CMakeLists.txt | 4 + .../unit/device/hipDeviceGetP2PAttribute.cc | 126 ++++++++++++++++++ .../device/hipDeviceGetP2PAttribute_exe.cc | 66 +++++++++ 3 files changed, 196 insertions(+) create mode 100644 projects/hip/tests/catch/unit/device/hipDeviceGetP2PAttribute.cc create mode 100644 projects/hip/tests/catch/unit/device/hipDeviceGetP2PAttribute_exe.cc diff --git a/projects/hip/tests/catch/unit/device/CMakeLists.txt b/projects/hip/tests/catch/unit/device/CMakeLists.txt index 247867bf5c..7d72853100 100644 --- a/projects/hip/tests/catch/unit/device/CMakeLists.txt +++ b/projects/hip/tests/catch/unit/device/CMakeLists.txt @@ -16,11 +16,14 @@ set(TEST_SRC hipGetSetDeviceFlags.cc hipSetGetDevice.cc hipDeviceGetUuid.cc + hipDeviceGetP2PAttribute.cc ) set_source_files_properties(hipGetDeviceCount.cc PROPERTIES COMPILE_FLAGS -std=c++17) +set_source_files_properties(hipDeviceGetP2PAttribute.cc PROPERTIES COMPILE_FLAGS -std=c++17) add_executable(getDeviceCount EXCLUDE_FROM_ALL getDeviceCount_exe.cc) +add_executable(hipDeviceGetP2PAttribute EXCLUDE_FROM_ALL hipDeviceGetP2PAttribute_exe.cc) hip_add_exe_to_target(NAME DeviceTest TEST_SRC ${TEST_SRC} @@ -28,3 +31,4 @@ hip_add_exe_to_target(NAME DeviceTest COMPILE_OPTIONS -std=c++14) add_dependencies(DeviceTest getDeviceCount) +add_dependencies(DeviceTest hipDeviceGetP2PAttribute) diff --git a/projects/hip/tests/catch/unit/device/hipDeviceGetP2PAttribute.cc b/projects/hip/tests/catch/unit/device/hipDeviceGetP2PAttribute.cc new file mode 100644 index 0000000000..805eb117ff --- /dev/null +++ b/projects/hip/tests/catch/unit/device/hipDeviceGetP2PAttribute.cc @@ -0,0 +1,126 @@ +/* +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. +*/ + +#include +#include +#include +#include "hip/hip_runtime_api.h" +#include +#include + +/** + * @brief Test all possible combination of attributes and devices for hipDeviceGetP2PAttribute. + * Verify that the output is within the range of acceptable values. + * + */ +TEST_CASE("Unit_hipDeviceGetP2PAttribute_Basic") { +#if HT_AMD + HipTest::HIP_SKIP_TEST("EXSWCPHIPT-119"); + return; +#else + + int deviceCount = HipTest::getGeviceCount(); + if (deviceCount < 2) { + HipTest::HIP_SKIP_TEST("Skipping because devices < 2"); + return; + } + + hipDeviceP2PAttr attribute = + GENERATE(hipDevP2PAttrPerformanceRank, hipDevP2PAttrAccessSupported, + hipDevP2PAttrNativeAtomicSupported, hipDevP2PAttrHipArrayAccessSupported); + + /* Test all combinations of devices in the system */ + for (int srcDevice = 0; srcDevice < deviceCount; ++srcDevice) { + for (int dstDevice = 0; dstDevice < deviceCount; ++dstDevice) { + if (srcDevice != dstDevice) { + int value{-1}; + HIP_CHECK(hipDeviceGetP2PAttribute(&value, attribute, srcDevice, dstDevice)); + INFO("hipDeviceP2PAttr: " << attribute << "\nsrcDevice: " << srcDevice + << "\ndstDevice: " << dstDevice << "\nValue: " << value); + if (attribute == hipDevP2PAttrPerformanceRank) { + REQUIRE(value >= 0); + } else { + REQUIRE((value == 0 || value == 1)); + } + } + } + } +#endif +} + +/** + * @brief Negative test scenarios for hipDeviceGetP2PAttribute + * + */ +TEST_CASE("Unit_hipDeviceGetP2PAttribute_Negative") { +#if HT_AMD + HipTest::HIP_SKIP_TEST("EXSWCPHIPT-122"); + return; +#else + + int deviceCount = HipTest::getGeviceCount(); + if (deviceCount < 2) { + HipTest::HIP_SKIP_TEST("Skipping because devices < 2"); + return; + } + + int value; + int validSrcDevice = 0; + int validDstDevice = 1; + hipDeviceP2PAttr validAttr = hipDevP2PAttrAccessSupported; + + SECTION("Nullptr value") { + HIP_CHECK_ERROR(hipDeviceGetP2PAttribute(nullptr, validAttr, validSrcDevice, validDstDevice), + hipErrorInvalidValue); + } + + SECTION("Invalid attribute") { + hipDeviceP2PAttr invalidAttr = static_cast(10); + HIP_CHECK_ERROR(hipDeviceGetP2PAttribute(&value, invalidAttr, validSrcDevice, validDstDevice), + hipErrorInvalidValue); + } + + SECTION("Invalid device") { + int invalidDevice = -1; + HIP_CHECK_ERROR(hipDeviceGetP2PAttribute(&value, validAttr, invalidDevice, validDstDevice), + hipErrorInvalidDevice); + HIP_CHECK_ERROR(hipDeviceGetP2PAttribute(&value, validAttr, validSrcDevice, invalidDevice), + hipErrorInvalidDevice); + } + + /* https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#env-vars */ + SECTION("Hidden devices using environment variables") { + REQUIRE(hip::SpawnProc("hipDeviceGetP2PAttribute").run("") == hipSuccess); + REQUIRE(hip::SpawnProc("hipDeviceGetP2PAttribute").run("0") == hipErrorInvalidDevice); + REQUIRE(hip::SpawnProc("hipDeviceGetP2PAttribute").run("1") == hipErrorInvalidDevice); + REQUIRE(hip::SpawnProc("hipDeviceGetP2PAttribute").run("0,1") == hipSuccess); + REQUIRE(hip::SpawnProc("hipDeviceGetP2PAttribute").run("-1,0") == hipErrorNoDevice); + REQUIRE(hip::SpawnProc("hipDeviceGetP2PAttribute").run("0,-1") == hipErrorInvalidDevice); + REQUIRE(hip::SpawnProc("hipDeviceGetP2PAttribute").run("0,1,-1") == hipSuccess); + REQUIRE(hip::SpawnProc("hipDeviceGetP2PAttribute").run("0,-1,1") == hipErrorInvalidDevice); + + if (deviceCount > 2) { + REQUIRE(hip::SpawnProc("hipDeviceGetP2PAttribute").run("2,1") == hipSuccess); + REQUIRE(hip::SpawnProc("hipDeviceGetP2PAttribute").run("2") == hipErrorInvalidDevice); + } else { + REQUIRE(hip::SpawnProc("hipDeviceGetP2PAttribute").run("2,1") == hipErrorNoDevice); + } + } +#endif +} \ No newline at end of file diff --git a/projects/hip/tests/catch/unit/device/hipDeviceGetP2PAttribute_exe.cc b/projects/hip/tests/catch/unit/device/hipDeviceGetP2PAttribute_exe.cc new file mode 100644 index 0000000000..44e98495ca --- /dev/null +++ b/projects/hip/tests/catch/unit/device/hipDeviceGetP2PAttribute_exe.cc @@ -0,0 +1,66 @@ +/* +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 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. +*/ + +#include +#include "hip/hip_runtime_api.h" +#include + + +void inline hideDevices(const char* devices) { +#if HT_NVIDIA + setenv("CUDA_VISIBLE_DEVICES", devices, 1); +#else + setenv("HIP_VISIBLE_DEVICES", devices, 1); + setenv("ROCR_VISIBLE_DEVICES", devices, 1); +#endif +} + +void inline unhideAllDevices() { +#if HT_NVIDIA + unsetenv("CUDA_VISIBLE_DEVICES"); +#else + unsetenv("HIP_VISIBLE_DEVICES"); + unsetenv("ROCR_VISIBLE_DEVICES"); +#endif +} + +/** + * @brief Runs hipDeviceGetP2PAttribute with srcDevice = 0 and dstDevice = 1 + * Expects 1 command line arg, which is the Device Visible String + * + * @return the error code returned by hipDeviceGetP2PAttribute + */ +int main(int argc, char** argv) { + int value; + const int srcDevice = 0; + const int dstDevice = 1; + const hipDeviceP2PAttr validAttr = hipDevP2PAttrAccessSupported; + + if (argc == 2) { + hideDevices(argv[1]); + } + + hipError_t error = hipDeviceGetP2PAttribute(&value, validAttr, srcDevice, dstDevice); + + if (argc == 2) { + unhideAllDevices(); + } + + return error; +} \ No newline at end of file