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
212 lines
6.1 KiB
C++
212 lines
6.1 KiB
C++
/*
|
|
* Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#include <algorithm>
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "suites/functional/memory_fill.h"
|
|
#include "common/base_rocr_utils.h"
|
|
#include "common/common.h"
|
|
#include "common/helper_funcs.h"
|
|
#include "gtest/gtest.h"
|
|
#include "hsa/hsa.h"
|
|
|
|
static const int kMemoryAllocSize = 4096;
|
|
static const uint32_t kFillValueA = 0xDEADBEEF;
|
|
static const uint32_t kFillValueB = 0xA5A5A5A5;
|
|
|
|
MemoryFill::MemoryFill(void) : TestBase() {
|
|
set_num_iteration(10);
|
|
set_title("RocR Memory Fill Test");
|
|
set_description("This test will use hsa_amd_memory_fill on system and GPU memory.");
|
|
}
|
|
|
|
MemoryFill::~MemoryFill(void) {
|
|
}
|
|
|
|
void MemoryFill::SetUp(void) {
|
|
hsa_status_t err;
|
|
|
|
TestBase::SetUp();
|
|
if (test_skipped_) return;
|
|
|
|
err = rocrtst::SetDefaultAgents(this);
|
|
ASSERT_EQ(HSA_STATUS_SUCCESS, err);
|
|
|
|
err = rocrtst::SetPoolsTypical(this);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
return;
|
|
}
|
|
|
|
void MemoryFill::Run(void) {
|
|
if (!rocrtst::CheckProfile(this)) {
|
|
return;
|
|
}
|
|
|
|
TestBase::Run();
|
|
}
|
|
|
|
void MemoryFill::DisplayTestInfo(void) {
|
|
TestBase::DisplayTestInfo();
|
|
}
|
|
|
|
void MemoryFill::DisplayResults(void) const {
|
|
if (!rocrtst::CheckProfile(this)) {
|
|
return;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void MemoryFill::Close(void) {
|
|
TestBase::Close();
|
|
}
|
|
|
|
void MemoryFill::MemoryFillTest(hsa_agent_t cpuAgent, hsa_agent_t gpuAgent) {
|
|
hsa_status_t err;
|
|
|
|
const int kNumDwords = kMemoryAllocSize / sizeof(uint32_t);
|
|
const int kOffsetDwords = 64;
|
|
const int kRegionDwords = 256;
|
|
|
|
hsa_amd_memory_pool_t global_pool;
|
|
err = hsa_amd_agent_iterate_memory_pools(cpuAgent,
|
|
rocrtst::GetGlobalMemoryPool,
|
|
&global_pool);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
hsa_amd_memory_pool_t gpu_pool;
|
|
err = hsa_amd_agent_iterate_memory_pools(gpuAgent,
|
|
rocrtst::GetGlobalMemoryPool,
|
|
&gpu_pool);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
hsa_amd_memory_pool_access_t access;
|
|
err = hsa_amd_agent_memory_pool_get_info(cpuAgent, gpu_pool,
|
|
HSA_AMD_AGENT_MEMORY_POOL_INFO_ACCESS,
|
|
&access);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
uint32_t* sysBuf = NULL;
|
|
err = hsa_amd_memory_pool_allocate(global_pool, kMemoryAllocSize, 0,
|
|
reinterpret_cast<void**>(&sysBuf));
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
memset(sysBuf, 0, kMemoryAllocSize);
|
|
|
|
err = hsa_amd_memory_fill(sysBuf, kFillValueA, kNumDwords);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
for (int i = 0; i < kNumDwords; ++i) {
|
|
ASSERT_EQ(sysBuf[i], kFillValueA);
|
|
}
|
|
|
|
uint32_t* gpuBuf = NULL;
|
|
uint32_t* g_gpuBuf = NULL;
|
|
uint32_t* staging = NULL;
|
|
hsa_signal_t copy_signal;
|
|
|
|
if (access != HSA_AMD_MEMORY_POOL_ACCESS_NEVER_ALLOWED) {
|
|
err = hsa_amd_memory_pool_allocate(gpu_pool, kMemoryAllocSize, 0,
|
|
reinterpret_cast<void**>(&gpuBuf));
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
err = hsa_amd_agents_allow_access(1, &cpuAgent, NULL, gpuBuf);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
memset(gpuBuf, 0, kMemoryAllocSize);
|
|
|
|
err = hsa_amd_memory_fill(gpuBuf, kFillValueA, kNumDwords);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
err = hsa_amd_memory_fill(gpuBuf + kOffsetDwords, kFillValueB, kRegionDwords);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
for (int i = 0; i < kNumDwords; ++i) {
|
|
if (i >= kOffsetDwords && i < (kOffsetDwords + kRegionDwords)) {
|
|
ASSERT_EQ(gpuBuf[i], kFillValueB);
|
|
} else {
|
|
ASSERT_EQ(gpuBuf[i], kFillValueA);
|
|
}
|
|
}
|
|
} else {
|
|
err = hsa_signal_create(1, 0, NULL, ©_signal);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
err = hsa_amd_memory_pool_allocate(gpu_pool, kMemoryAllocSize, 0,
|
|
reinterpret_cast<void**>(&g_gpuBuf));
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
err = hsa_amd_memory_pool_allocate(global_pool, kMemoryAllocSize, 0,
|
|
reinterpret_cast<void**>(&staging));
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
memset(staging, 0, kMemoryAllocSize);
|
|
|
|
err = hsa_amd_agents_allow_access(1, &gpuAgent, NULL, staging);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
err = hsa_amd_memory_fill(g_gpuBuf, kFillValueA, kNumDwords);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
err = hsa_amd_memory_fill(g_gpuBuf + kOffsetDwords, kFillValueB, kRegionDwords);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
hsa_signal_store_relaxed(copy_signal, 1);
|
|
err = hsa_amd_memory_async_copy(staging, gpuAgent, g_gpuBuf, gpuAgent,
|
|
kMemoryAllocSize, 0, NULL, copy_signal);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
while (hsa_signal_wait_acquire(copy_signal, HSA_SIGNAL_CONDITION_LT, 1,
|
|
(uint64_t)(-1), HSA_WAIT_STATE_ACTIVE)) { }
|
|
|
|
for (int i = 0; i < kNumDwords; ++i) {
|
|
if (i >= kOffsetDwords && i < (kOffsetDwords + kRegionDwords)) {
|
|
ASSERT_EQ(staging[i], kFillValueB);
|
|
} else {
|
|
ASSERT_EQ(staging[i], kFillValueA);
|
|
}
|
|
}
|
|
|
|
err = hsa_signal_destroy(copy_signal);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
}
|
|
|
|
if (sysBuf) {
|
|
err = hsa_amd_memory_pool_free(sysBuf);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
}
|
|
if (staging) {
|
|
err = hsa_amd_memory_pool_free(staging);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
}
|
|
if (g_gpuBuf) {
|
|
err = hsa_amd_memory_pool_free(g_gpuBuf);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
}
|
|
if (gpuBuf) {
|
|
err = hsa_amd_memory_pool_free(gpuBuf);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
}
|
|
}
|
|
|
|
void MemoryFill::MemoryFillTest(void) {
|
|
hsa_status_t err;
|
|
|
|
std::vector<hsa_agent_t> cpus;
|
|
err = hsa_iterate_agents(rocrtst::IterateCPUAgents, &cpus);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
std::vector<hsa_agent_t> gpus;
|
|
err = hsa_iterate_agents(rocrtst::IterateGPUAgents, &gpus);
|
|
ASSERT_EQ(err, HSA_STATUS_SUCCESS);
|
|
|
|
for (unsigned int i = 0; i < gpus.size(); ++i) {
|
|
MemoryFillTest(cpus[0], gpus[i]);
|
|
}
|
|
}
|