CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
132 lines
4.3 KiB
C++
132 lines
4.3 KiB
C++
/*
|
|
* Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#include <hip_test_common.hh>
|
|
|
|
#include <atomic>
|
|
#include <cstring>
|
|
#include <thread>
|
|
#include <vector>
|
|
|
|
namespace {
|
|
|
|
struct Transfer {
|
|
int src_gpu;
|
|
int dma_gpu;
|
|
bool dst_is_gpu;
|
|
int dst_index;
|
|
};
|
|
|
|
constexpr Transfer kTransfers[] = {
|
|
{0, 0, false, 0}, {1, 1, false, 0}, {2, 2, false, 0}, {3, 3, false, 0},
|
|
{4, 4, false, 1}, {5, 5, false, 1}, {6, 6, false, 1}, {7, 7, false, 1},
|
|
{0, 0, false, 1}, {1, 1, false, 1}, {2, 2, false, 1}, {3, 3, false, 1},
|
|
{4, 4, false, 0}, {5, 5, false, 0}, {6, 6, false, 0}, {7, 7, false, 0},
|
|
{0, 0, true, 0}, {0, 0, true, 1}, {0, 0, true, 2}, {0, 0, true, 3},
|
|
{0, 0, true, 4}, {0, 0, true, 5}, {0, 0, true, 6}, {0, 0, true, 7},
|
|
{1, 1, true, 1}, {1, 1, true, 2}, {1, 1, true, 3}, {1, 1, true, 4},
|
|
{1, 1, true, 5}, {1, 1, true, 6}, {1, 1, true, 7},
|
|
{2, 2, true, 3}, {2, 2, true, 4}, {2, 2, true, 5}, {2, 2, true, 6},
|
|
{2, 2, true, 7},
|
|
{3, 3, true, 3}, {3, 3, true, 4}, {3, 3, true, 5}, {3, 3, true, 6},
|
|
{3, 3, true, 7},
|
|
{4, 4, true, 4}, {4, 4, true, 5}, {4, 4, true, 6}, {4, 4, true, 7},
|
|
{5, 5, true, 5}, {5, 5, true, 6}, {5, 5, true, 7},
|
|
{6, 6, true, 6}, {6, 6, true, 7},
|
|
{7, 7, true, 7},
|
|
};
|
|
|
|
} // namespace
|
|
|
|
HIP_TEST_CASE(Unit_hipMemcpy_DynamicQueueChurn_StagedCopies) {
|
|
int device_count = 0;
|
|
HIP_CHECK(hipGetDeviceCount(&device_count));
|
|
if (device_count < 8) {
|
|
HIP_SKIP_TEST("Requires at least 8 GPUs");
|
|
}
|
|
|
|
const size_t kSize = isQuickLevel() ? 128ULL * 1024ULL * 1024ULL
|
|
: 1ULL * 1024ULL * 1024ULL * 1024ULL;
|
|
void* device_buffers[8] = {};
|
|
void* host_buffers[2] = {};
|
|
|
|
for (int dev = 0; dev < 8; ++dev) {
|
|
HIP_CHECK(hipSetDevice(dev));
|
|
for (int peer = 0; peer < 8; ++peer) {
|
|
if (peer != dev) {
|
|
int can_access_peer = 0;
|
|
HIP_CHECK(hipDeviceCanAccessPeer(&can_access_peer, dev, peer));
|
|
if (can_access_peer != 0) {
|
|
hipError_t peer_access = hipDeviceEnablePeerAccess(peer, 0);
|
|
if (peer_access != hipSuccess && peer_access != hipErrorPeerAccessAlreadyEnabled) {
|
|
HIP_CHECK(peer_access);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
HIP_CHECK(hipMalloc(&device_buffers[dev], kSize));
|
|
HIP_CHECK(hipMemset(device_buffers[dev], 0, kSize));
|
|
HIP_CHECK(hipDeviceSynchronize());
|
|
}
|
|
|
|
HIP_CHECK(hipSetDevice(0));
|
|
HIP_CHECK(hipHostMalloc(&host_buffers[0], kSize));
|
|
HIP_CHECK(hipHostMalloc(&host_buffers[1], kSize));
|
|
std::memset(host_buffers[0], 0, kSize);
|
|
std::memset(host_buffers[1], 0, kSize);
|
|
HIP_CHECK(hipDeviceSynchronize());
|
|
|
|
std::vector<hipStream_t> streams(std::size(kTransfers));
|
|
for (size_t i = 0; i < std::size(kTransfers); ++i) {
|
|
HIP_CHECK(hipSetDevice(kTransfers[i].dma_gpu));
|
|
HIP_CHECK(hipStreamCreate(&streams[i]));
|
|
}
|
|
|
|
std::atomic<bool> failed{false};
|
|
std::vector<std::thread> threads;
|
|
threads.reserve(std::size(kTransfers));
|
|
|
|
for (size_t i = 0; i < std::size(kTransfers); ++i) {
|
|
threads.emplace_back([&, i]() {
|
|
const Transfer& transfer = kTransfers[i];
|
|
if (hipSetDevice(transfer.dma_gpu) != hipSuccess) {
|
|
failed.store(true, std::memory_order_relaxed);
|
|
return;
|
|
}
|
|
void* dst = transfer.dst_is_gpu ? device_buffers[transfer.dst_index]
|
|
: host_buffers[transfer.dst_index];
|
|
void* src = device_buffers[transfer.src_gpu];
|
|
if (hipMemcpyAsync(dst, src, kSize, hipMemcpyDefault, streams[i]) != hipSuccess) {
|
|
failed.store(true, std::memory_order_relaxed);
|
|
return;
|
|
}
|
|
if (hipStreamSynchronize(streams[i]) != hipSuccess) {
|
|
failed.store(true, std::memory_order_relaxed);
|
|
}
|
|
});
|
|
}
|
|
|
|
for (auto& thread : threads) {
|
|
thread.join();
|
|
}
|
|
const bool transfer_failed = failed.load(std::memory_order_relaxed);
|
|
HIP_CHECK(hipDeviceSynchronize());
|
|
|
|
for (size_t i = 0; i < std::size(kTransfers); ++i) {
|
|
HIP_CHECK(hipSetDevice(kTransfers[i].dma_gpu));
|
|
HIP_CHECK(hipStreamDestroy(streams[i]));
|
|
}
|
|
|
|
HIP_CHECK(hipHostFree(host_buffers[0]));
|
|
HIP_CHECK(hipHostFree(host_buffers[1]));
|
|
for (int dev = 0; dev < 8; ++dev) {
|
|
HIP_CHECK(hipSetDevice(dev));
|
|
HIP_CHECK(hipFree(device_buffers[dev]));
|
|
}
|
|
HIP_CHECK(hipDeviceSynchronize());
|
|
REQUIRE_FALSE(transfer_failed);
|
|
}
|