Files
TheRock/rocm-systems/projects/hip-tests/catch/unit/graph/hipGraphNodeGetEnabled.cc
T
derek.holloway 7502bf64a4
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
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

259 lines
11 KiB
C++

/*
* Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
*
* SPDX-License-Identifier: MIT
*/
#include <hip_test_common.hh>
#include <hip_test_checkers.hh>
#include <hip_test_kernels.hh>
#define N 1024
/**
* Functional Test for API - hipGraphNodeGetEnabled
1) Add MemCpy node to the graph and verify in graphExec it enabled status
2) Add MemSet node to the graph and verify in graphExec it enabled status
3) Add Kernel node to the graph and verify in graphExec it enabled status
- Can check other node type, as only above 3 types are mentioned in the doc
4) Add HostNode node to the graph and verify in graphExec it enabled status
5) Add emptyNode node to the graph and verify in graphExec it enabled status
6) Add ChildNode node to the graph and verify in graphExec it enabled status
7) Add EventWait node to the graph and verify in graphExec it enabled status
8) Add EventRecord node to the graph and verify in graphExec it enabled status
*/
static void callbackfunc(void* A_h) {
int* A = reinterpret_cast<int*>(A_h);
for (int i = 0; i < N; i++) {
A[i] = i;
}
}
HIP_TEST_CASE(Unit_hipGraphNodeGetEnabled_Functional_Basic) {
constexpr size_t Nbytes = N * sizeof(int);
constexpr auto blocksPerCU = 6; // to hide latency
constexpr auto threadsPerBlock = 256;
hipGraph_t graph, childGraph;
hipGraphNode_t memcpy_A, memcpy_B, memsetNode, kNodeAdd;
hipGraphNode_t hostNode, emptyNode, childGraphNode, eventWait, eventRecord;
int *A_d, *B_d, *C_d, *A_h, *B_h, *C_h;
hipGraphExec_t graphExec;
size_t NElem{N};
unsigned int isEnabled = 0;
hipError_t ret;
HipTest::initArrays(&A_d, &B_d, &C_d, &A_h, &B_h, &C_h, N, false);
unsigned blocks = HipTest::setNumBlocks(blocksPerCU, threadsPerBlock, N);
HIP_CHECK(hipGraphCreate(&graph, 0));
HIP_CHECK(hipGraphAddMemcpyNode1D(&memcpy_A, graph, nullptr, 0, A_d, A_h, Nbytes,
hipMemcpyHostToDevice));
void* kernelArgs[] = {&A_d, &B_d, &C_d, reinterpret_cast<void*>(&NElem)};
hipKernelNodeParams kNodeParams{};
kNodeParams.func = reinterpret_cast<void*>(HipTest::vectorADD<int>);
kNodeParams.gridDim = dim3(blocks);
kNodeParams.blockDim = dim3(threadsPerBlock);
kNodeParams.sharedMemBytes = 0;
kNodeParams.kernelParams = reinterpret_cast<void**>(kernelArgs);
kNodeParams.extra = nullptr;
HIP_CHECK(hipGraphAddKernelNode(&kNodeAdd, graph, nullptr, 0, &kNodeParams));
hipMemsetParams memsetParams{};
memset(&memsetParams, 0, sizeof(memsetParams));
memsetParams.dst = reinterpret_cast<void*>(B_d);
memsetParams.value = 7;
memsetParams.pitch = 0;
memsetParams.elementSize = sizeof(char);
memsetParams.width = Nbytes;
memsetParams.height = 1;
HIP_CHECK(hipGraphAddMemsetNode(&memsetNode, graph, nullptr, 0, &memsetParams));
HIP_CHECK(hipGraphAddEmptyNode(&emptyNode, graph, NULL, 0));
hipHostNodeParams hostParams = {0, 0};
hostParams.fn = callbackfunc;
hostParams.userData = A_h;
HIP_CHECK(hipGraphAddHostNode(&hostNode, graph, nullptr, 0, &hostParams));
hipEvent_t event;
HIP_CHECK(hipEventCreate(&event));
HIP_CHECK(hipGraphAddEventRecordNode(&eventRecord, graph, nullptr, 0, event));
HIP_CHECK(hipGraphAddEventWaitNode(&eventWait, graph, nullptr, 0, event));
HIP_CHECK(hipGraphCreate(&childGraph, 0));
HIP_CHECK(hipGraphAddMemcpyNode1D(&memcpy_B, childGraph, nullptr, 0, B_d, B_h, Nbytes,
hipMemcpyHostToDevice));
// Adding child node to clonedGraph
HIP_CHECK(hipGraphAddChildGraphNode(&childGraphNode, graph, nullptr, 0, childGraph));
HIP_CHECK(hipGraphInstantiate(&graphExec, graph, NULL, NULL, 0));
SECTION("Create graphExec with Kernel node and verify its enabled status") {
HIP_CHECK(hipGraphNodeGetEnabled(graphExec, kNodeAdd, &isEnabled));
REQUIRE(1 == isEnabled);
}
SECTION("Create graphExec with MemCpy node and verify its enabled status") {
HIP_CHECK(hipGraphNodeGetEnabled(graphExec, memcpy_A, &isEnabled));
REQUIRE(1 == isEnabled);
}
SECTION("Create graphExec with MemSet node and verify its enabled status") {
HIP_CHECK(hipGraphNodeGetEnabled(graphExec, memsetNode, &isEnabled));
REQUIRE(1 == isEnabled);
}
SECTION("Create graphExec with hostNode and verify its enabled status") {
ret = hipGraphNodeGetEnabled(graphExec, hostNode, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Create graphExec with emptyNode and verify its enabled status") {
ret = hipGraphNodeGetEnabled(graphExec, emptyNode, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Create graphExec with ChildGraphNode & verify its enabled status") {
ret = hipGraphNodeGetEnabled(graphExec, childGraphNode, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Create graphExec with EventWait and verify its enabled status") {
ret = hipGraphNodeGetEnabled(graphExec, eventWait, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Create graphExec with EventRecord and verify its enabled status") {
ret = hipGraphNodeGetEnabled(graphExec, eventRecord, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
HIP_CHECK(hipGraphExecDestroy(graphExec));
HIP_CHECK(hipGraphDestroy(childGraph));
HIP_CHECK(hipGraphDestroy(graph));
HIP_CHECK(hipEventDestroy(event));
HipTest::freeArrays(A_d, B_d, C_d, A_h, B_h, C_h, false);
}
/**
Negative Test for API - hipGraphNodeGetEnabled
1) Pass graphExec as nullptr
2) Pass graphExec as uninitialized object
3) Pass Node as nullptr
4) Pass Node as uninitialized object
5) Pass isEnabled as nullptr
Negative Functional Test for API - hipGraphNodeGetEnabled
6) Pass hNode from different graph and verify
7) Create graphExec and then add one more new node to the graph verify
8) Pass hNode as clonedGraph node and exec as graphExec
9) Pass graphExec as clonedGraphExec and hNode as graph node
10) Pass hNode a deleted node from same graph where exec was created
11) Create graphExec and then delete the graph and verify a node
12) Create graphExec and then delete the graphExec and verify a node
*/
HIP_TEST_CASE(Unit_hipGraphNodeGetEnabled_Negative_Functional) {
constexpr size_t Nbytes = N * sizeof(int);
constexpr auto blocksPerCU = 6; // to hide latency
constexpr auto threadsPerBlock = 256;
hipGraph_t graph, graph2, clonedGraph;
hipGraphNode_t memcpy_A, memcpy_A_C, memcpy_B, memcpy_A2, memcpy_C, kNodeAdd;
hipKernelNodeParams kNodeParams{};
int *A_d, *B_d, *C_d, *A_h, *B_h, *C_h;
hipGraphExec_t graphExec, graphExec2, clonedGraphExec;
size_t NElem{N};
unsigned int isEnabled;
hipError_t ret;
HipTest::initArrays(&A_d, &B_d, &C_d, &A_h, &B_h, &C_h, N, false);
unsigned blocks = HipTest::setNumBlocks(blocksPerCU, threadsPerBlock, N);
HIP_CHECK(hipGraphCreate(&graph, 0));
HIP_CHECK(hipGraphAddMemcpyNode1D(&memcpy_A, graph, nullptr, 0, A_d, A_h, Nbytes,
hipMemcpyHostToDevice));
HIP_CHECK(hipGraphAddMemcpyNode1D(&memcpy_B, graph, nullptr, 0, B_d, B_h, Nbytes,
hipMemcpyHostToDevice));
void* kernelArgs[] = {&A_d, &B_d, &C_d, reinterpret_cast<void*>(&NElem)};
kNodeParams.func = reinterpret_cast<void*>(HipTest::vectorADD<int>);
kNodeParams.gridDim = dim3(blocks);
kNodeParams.blockDim = dim3(threadsPerBlock);
kNodeParams.sharedMemBytes = 0;
kNodeParams.kernelParams = reinterpret_cast<void**>(kernelArgs);
kNodeParams.extra = nullptr;
HIP_CHECK(hipGraphAddKernelNode(&kNodeAdd, graph, nullptr, 0, &kNodeParams));
HIP_CHECK(hipGraphAddDependencies(graph, &memcpy_A, &kNodeAdd, 1));
HIP_CHECK(hipGraphAddDependencies(graph, &memcpy_B, &kNodeAdd, 1));
HIP_CHECK(hipGraphInstantiate(&graphExec, graph, NULL, NULL, 0));
HIP_CHECK(hipGraphInstantiate(&graphExec2, graph, NULL, NULL, 0));
HIP_CHECK(hipGraphClone(&clonedGraph, graph));
HIP_CHECK(hipGraphInstantiate(&clonedGraphExec, clonedGraph, nullptr, nullptr, 0));
HIP_CHECK(hipGraphNodeFindInClone(&memcpy_A_C, memcpy_A, clonedGraph));
HIP_CHECK(hipGraphAddMemcpyNode1D(&memcpy_C, graph, nullptr, 0, C_h, C_d, Nbytes,
hipMemcpyDeviceToHost));
HIP_CHECK(hipGraphAddDependencies(graph, &kNodeAdd, &memcpy_C, 1));
HIP_CHECK(hipGraphCreate(&graph2, 0));
HIP_CHECK(hipGraphAddMemcpyNode1D(&memcpy_A2, graph2, nullptr, 0, A_d, A_h, Nbytes,
hipMemcpyHostToDevice));
SECTION("Pass hGraphExec as nullptr") {
ret = hipGraphNodeGetEnabled(nullptr, memcpy_B, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Pass hGraphExec as uninitialized object") {
hipGraphExec_t graphExec_uninit{};
ret = hipGraphNodeGetEnabled(graphExec_uninit, memcpy_B, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Pass Node as nullptr") {
ret = hipGraphNodeGetEnabled(graphExec, nullptr, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Pass Node as uninitialized object") {
hipGraphNode_t node_uninit{};
ret = hipGraphNodeGetEnabled(graphExec, node_uninit, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Pass isEnabled as nullptr") {
ret = hipGraphNodeGetEnabled(graphExec, memcpy_B, nullptr);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Pass hNode from different graph and verify") {
ret = hipGraphNodeGetEnabled(graphExec, memcpy_A2, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Create graphExec and add one more new node to the graph & verify") {
ret = hipGraphNodeGetEnabled(graphExec, memcpy_C, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Pass hNode as clonedGraph node and exec as graphExec") {
ret = hipGraphNodeGetEnabled(graphExec, memcpy_A_C, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Pass graphExec as clonedGraphExec and hNode as graph node") {
ret = hipGraphNodeGetEnabled(clonedGraphExec, memcpy_A, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
SECTION("Pass hNode a deleted node from same graph where exec was created") {
HIP_CHECK(hipGraphDestroyNode(memcpy_A));
ret = hipGraphNodeGetEnabled(graphExec, memcpy_A, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
HIP_CHECK(hipGraphExecDestroy(graphExec2));
SECTION("Create graphExec and then delete the graphExec and verify a node") {
ret = hipGraphNodeGetEnabled(graphExec2, memcpy_B, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
HIP_CHECK(hipGraphDestroy(graph));
SECTION("Create graphExec and then delete the graph and verify a node") {
ret = hipGraphNodeGetEnabled(graphExec, memcpy_B, &isEnabled);
REQUIRE(hipErrorInvalidValue == ret);
}
HipTest::freeArrays(A_d, B_d, C_d, A_h, B_h, C_h, false);
HIP_CHECK(hipGraphExecDestroy(graphExec));
HIP_CHECK(hipGraphExecDestroy(clonedGraphExec));
HIP_CHECK(hipGraphDestroy(clonedGraph));
HIP_CHECK(hipGraphDestroy(graph2));
}