/* * Copyright (c) Advanced Micro Devices, Inc., or its affiliates. * * SPDX-License-Identifier: MIT */ #include #include #include #include #include #include #pragma clang diagnostic ignored "-Wunused-variable" HIP_TEST_CASE(Unit_hipMemcpy3DAsync_Positive_Basic) { constexpr bool async = true; const auto stream_type = GENERATE(Streams::nullstream, Streams::perThread, Streams::created); const StreamGuard stream_guard(stream_type); const hipStream_t stream = stream_guard.stream(); SECTION("Device to Host") { Memcpy3DDeviceToHostShell(Memcpy3DWrapper, stream); } SECTION("Device to Device") { SECTION("Peer access disabled") { Memcpy3DDeviceToDeviceShell(Memcpy3DWrapper, stream); } SECTION("Peer access enabled") { Memcpy3DDeviceToDeviceShell(Memcpy3DWrapper, stream); } } SECTION("Host to Device") { Memcpy3DHostToDeviceShell(Memcpy3DWrapper, stream); } SECTION("Host to Host") { Memcpy3DHostToHostShell(Memcpy3DWrapper, stream); } } HIP_TEST_CASE(Unit_hipMemcpy3DAsync_Positive_Synchronization_Behavior) { constexpr bool async = true; HIP_CHECK(hipDeviceSynchronize()); SECTION("Host to Device") { Memcpy3DHtoDSyncBehavior(Memcpy3DWrapper, false); } SECTION("Device to Pageable Host") { Memcpy3DDtoHPageableSyncBehavior(Memcpy3DWrapper, true); } SECTION("Device to Pinned Host") { Memcpy3DDtoHPinnedSyncBehavior(Memcpy3DWrapper, false); } SECTION("Device to Device") { Memcpy3DDtoDSyncBehavior(Memcpy3DWrapper, false); } SECTION("Host to Host") { Memcpy3DHtoHSyncBehavior(Memcpy3DWrapper, true); } } HIP_TEST_CASE(Unit_hipMemcpy3DAsync_Positive_Parameters) { constexpr bool async = true; Memcpy3DZeroWidthHeightDepth(Memcpy3DWrapper); } HIP_TEST_CASE(Unit_hipMemcpy3DAsync_Positive_Array) { CHECK_IMAGE_SUPPORT constexpr bool async = true; SECTION("Array from/to Host") { Memcpy3DArrayHostShell(Memcpy3DWrapper); } #if HT_NVIDIA // Disabled on AMD due to defect - EXSWHTEC-238 SECTION("Array from/to Device") { Memcpy3DArrayDeviceShell(Memcpy3DWrapper); } #endif } HIP_TEST_CASE(Unit_hipMemcpy3DAsync_Negative_Parameters) { constexpr bool async = true; constexpr hipExtent extent{128 * sizeof(int), 128, 8}; constexpr auto NegativeTests = [](hipPitchedPtr dst_ptr, hipPos dst_pos, hipPitchedPtr src_ptr, hipPos src_pos, hipExtent extent, hipMemcpyKind kind) { SECTION("dst_ptr.ptr == nullptr") { hipPitchedPtr invalid_ptr = dst_ptr; invalid_ptr.ptr = nullptr; HIP_CHECK_ERROR(Memcpy3DWrapper(invalid_ptr, dst_pos, src_ptr, src_pos, extent, kind), hipErrorInvalidValue); } SECTION("src_ptr.ptr == nullptr") { hipPitchedPtr invalid_ptr = src_ptr; invalid_ptr.ptr = nullptr; HIP_CHECK_ERROR(Memcpy3DWrapper(dst_ptr, dst_pos, invalid_ptr, src_pos, extent, kind), hipErrorInvalidValue); } #if HT_NVIDIA // Disabled on AMD due to defect - EXSWHTEC-239 SECTION("dst_ptr.pitch < width") { hipPitchedPtr invalid_ptr = dst_ptr; invalid_ptr.pitch = extent.width - 1; HIP_CHECK_ERROR(Memcpy3DWrapper(invalid_ptr, dst_pos, src_ptr, src_pos, extent, kind), hipErrorInvalidPitchValue); } SECTION("src_ptr.pitch < width") { hipPitchedPtr invalid_ptr = src_ptr; invalid_ptr.pitch = extent.width - 1; HIP_CHECK_ERROR(Memcpy3DWrapper(dst_ptr, dst_pos, invalid_ptr, src_pos, extent, kind), hipErrorInvalidPitchValue); } #endif SECTION("dst_ptr.pitch > max pitch") { int attr = 0; HIP_CHECK(hipDeviceGetAttribute(&attr, hipDeviceAttributeMaxPitch, 0)); hipPitchedPtr invalid_ptr = dst_ptr; invalid_ptr.pitch = attr; HIP_CHECK_ERROR(Memcpy3DWrapper(invalid_ptr, dst_pos, src_ptr, src_pos, extent, kind), hipErrorInvalidValue); } SECTION("src_ptr.pitch > max pitch") { int attr = 0; HIP_CHECK(hipDeviceGetAttribute(&attr, hipDeviceAttributeMaxPitch, 0)); hipPitchedPtr invalid_ptr = src_ptr; invalid_ptr.pitch = attr; HIP_CHECK_ERROR(Memcpy3DWrapper(dst_ptr, dst_pos, invalid_ptr, src_pos, extent, kind), hipErrorInvalidValue); } #if HT_NVIDIA // Disabled on AMD due to defect - EXSWHTEC-237 SECTION("extent.width + dst_pos.x > dst_ptr.pitch") { hipPos invalid_pos = dst_pos; invalid_pos.x = dst_ptr.pitch - extent.width + 1; HIP_CHECK_ERROR(Memcpy3DWrapper(dst_ptr, invalid_pos, src_ptr, src_pos, extent, kind), hipErrorInvalidValue); } SECTION("extent.width + src_pos.x > src_ptr.pitch") { hipPos invalid_pos = src_pos; invalid_pos.x = src_ptr.pitch - extent.width + 1; HIP_CHECK_ERROR(Memcpy3DWrapper(dst_ptr, dst_pos, src_ptr, invalid_pos, extent, kind), hipErrorInvalidValue); } SECTION("dst_pos.y out of bounds") { hipPos invalid_pos = dst_pos; invalid_pos.y = 1; HIP_CHECK_ERROR(Memcpy3DWrapper(dst_ptr, invalid_pos, src_ptr, src_pos, extent, kind), hipErrorInvalidValue); } SECTION("src_pos.y out of bounds") { hipPos invalid_pos = src_pos; invalid_pos.y = 1; HIP_CHECK_ERROR(Memcpy3DWrapper(dst_ptr, dst_pos, src_ptr, invalid_pos, extent, kind), hipErrorInvalidValue); } SECTION("dst_pos.z out of bounds") { hipPos invalid_pos = dst_pos; invalid_pos.z = 1; HIP_CHECK_ERROR(Memcpy3DWrapper(dst_ptr, invalid_pos, src_ptr, src_pos, extent, kind), hipErrorInvalidValue); } SECTION("src_pos.z out of bounds") { hipPos invalid_pos = src_pos; invalid_pos.z = 1; HIP_CHECK_ERROR(Memcpy3DWrapper(dst_ptr, dst_pos, src_ptr, invalid_pos, extent, kind), hipErrorInvalidValue); } #endif #if HT_NVIDIA // Disabled on AMD due to defect - EXSWHTEC-234 SECTION("Invalid MemcpyKind") { HIP_CHECK_ERROR(Memcpy3DWrapper(dst_ptr, dst_pos, src_ptr, src_pos, extent, static_cast(-1)), hipErrorInvalidMemcpyDirection); } #endif }; SECTION("Host to Device") { LinearAllocGuard3D device_alloc(extent); LinearAllocGuard host_alloc( LinearAllocs::hipHostMalloc, device_alloc.pitch() * device_alloc.height() * device_alloc.depth()); NegativeTests(device_alloc.pitched_ptr(), make_hipPos(0, 0, 0), make_hipPitchedPtr(host_alloc.ptr(), device_alloc.pitch(), device_alloc.width(), device_alloc.height()), make_hipPos(0, 0, 0), extent, hipMemcpyHostToDevice); } SECTION("Device to Host") { LinearAllocGuard3D device_alloc(extent); LinearAllocGuard host_alloc( LinearAllocs::hipHostMalloc, device_alloc.pitch() * device_alloc.height() * device_alloc.depth()); NegativeTests(make_hipPitchedPtr(host_alloc.ptr(), device_alloc.pitch(), device_alloc.width(), device_alloc.height()), make_hipPos(0, 0, 0), device_alloc.pitched_ptr(), make_hipPos(0, 0, 0), extent, hipMemcpyDeviceToHost); } SECTION("Host to Host") { LinearAllocGuard src_alloc(LinearAllocs::hipHostMalloc, extent.width * extent.height * extent.depth); LinearAllocGuard dst_alloc(LinearAllocs::hipHostMalloc, extent.width * extent.height * extent.depth); NegativeTests(make_hipPitchedPtr(dst_alloc.ptr(), extent.width, extent.width, extent.height), make_hipPos(0, 0, 0), make_hipPitchedPtr(src_alloc.ptr(), extent.width, extent.width, extent.height), make_hipPos(0, 0, 0), extent, hipMemcpyHostToHost); } SECTION("Device to Device") { LinearAllocGuard3D src_alloc(extent); LinearAllocGuard3D dst_alloc(extent); NegativeTests(dst_alloc.pitched_ptr(), make_hipPos(0, 0, 0), src_alloc.pitched_ptr(), make_hipPos(0, 0, 0), extent, hipMemcpyDeviceToDevice); } } HIP_TEST_CASE(Unit_hipMemcpy3DAsync_Capture) { constexpr hipExtent kExtent{128 * sizeof(int), 128, 8}; LinearAllocGuard3D src_alloc(kExtent); LinearAllocGuard3D dst_alloc(kExtent); auto memcpy_params = GetMemcpy3DParms(dst_alloc.pitched_ptr(), make_hipPos(0, 0, 0), src_alloc.pitched_ptr(), make_hipPos(0, 0, 0), dst_alloc.extent(), hipMemcpyDeviceToDevice); hipStream_t stream = nullptr; HIP_CHECK(hipStreamCreate(&stream)); GENERATE_CAPTURE(); BEGIN_CAPTURE(stream); HIP_CHECK(hipMemcpy3DAsync(&memcpy_params, stream)); END_CAPTURE(stream); HIP_CHECK(hipStreamDestroy(stream)); }