|
| 1 | +# ============================================================================ # |
| 2 | +# Copyright (c) 2022 - 2025 NVIDIA Corporation & Affiliates. # |
| 3 | +# All rights reserved. # |
| 4 | +# # |
| 5 | +# This source code and the accompanying materials are made available under # |
| 6 | +# the terms of the Apache License 2.0 which accompanies this distribution. # |
| 7 | +# ============================================================================ # |
| 8 | + |
| 9 | +# Add nvq++ compile + execution test of code examples |
| 10 | +# Args: |
| 11 | +# TEST_NAME: name of the test executable. Test name is prefixed with "nvqpp" |
| 12 | +# SOURCE_LOCATION: location of the source file (relative to 'sphinx' directory by default) |
| 13 | +# Optional keyword args: |
| 14 | +# TARGET <TARGET_NAME>: name of the target to use |
| 15 | +# TARGET_OPTION <Option>: extra option for the target |
| 16 | +# SOURCE_DIR <DIR>: the directory that SOURCE_LOCATION is relative to (if not the default) |
| 17 | +# LAUNCH_COMMAND <COMMAND>: the command to launch the test (e.g., mpirun) |
| 18 | +function(add_nvqpp_test TEST_NAME SOURCE_LOCATION) |
| 19 | + cmake_parse_arguments(PARSED_ARGS "" "TARGET;LABELS;SOURCE_DIR;LAUNCH_COMMAND;APPLICATION_ARGS;TARGET_OPTION" "" ${ARGN}) |
| 20 | + set(NVQPP_COMPILE_ARGS "--library-mode ") |
| 21 | + if(PARSED_ARGS_TARGET) |
| 22 | + set(NVQPP_COMPILE_ARGS "${NVQPP_COMPILE_ARGS} --target ${PARSED_ARGS_TARGET}") |
| 23 | + if (PARSED_ARGS_TARGET_OPTION) |
| 24 | + set(NVQPP_COMPILE_ARGS "${NVQPP_COMPILE_ARGS} --${PARSED_ARGS_TARGET}-option ${PARSED_ARGS_TARGET_OPTION}") |
| 25 | + endif() |
| 26 | + endif() |
| 27 | + if (NOT PARSED_ARGS_SOURCE_DIR) |
| 28 | + set(PARSED_ARGS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/sphinx") |
| 29 | + endif() |
| 30 | + add_test( |
| 31 | + NAME |
| 32 | + nvqpp_${TEST_NAME} |
| 33 | + COMMAND |
| 34 | + bash -c "rm -f ${TEST_NAME}; ${CMAKE_BINARY_DIR}/bin/nvq++ ${NVQPP_COMPILE_ARGS} ${PARSED_ARGS_SOURCE_DIR}/${SOURCE_LOCATION} -o ${TEST_NAME} && \ |
| 35 | + ${PARSED_ARGS_LAUNCH_COMMAND} ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME} ${PARSED_ARGS_APPLICATION_ARGS}" |
| 36 | + ) |
| 37 | + if(PARSED_ARGS_LABELS) |
| 38 | + set_tests_properties(nvqpp_${TEST_NAME} PROPERTIES LABELS "${PARSED_ARGS_LABELS}") |
| 39 | + endif() |
| 40 | +endfunction() |
| 41 | + |
| 42 | +add_nvqpp_test(GHZ examples/cpp/basics/static_kernel.cpp) |
| 43 | +add_nvqpp_test(MultiControlOps examples/cpp/basics/multi_controlled_operations.cpp) |
| 44 | +add_nvqpp_test(ExpVals examples/cpp/basics/expectation_values.cpp) |
| 45 | +add_nvqpp_test(MidCircuitMeasurements examples/cpp/basics/mid_circuit_measurement.cpp) |
| 46 | +add_nvqpp_test(PhaseEstimation applications/cpp/phase_estimation.cpp) |
| 47 | +add_nvqpp_test(Grover applications/cpp/grover.cpp) |
| 48 | +add_nvqpp_test(QAOA applications/cpp/qaoa_maxcut.cpp) |
| 49 | +add_nvqpp_test(VQEH2 applications/cpp/vqe_h2.cpp) |
| 50 | +add_nvqpp_test(AmplitudeEstimation applications/cpp/amplitude_estimation.cpp) |
| 51 | +add_nvqpp_test(Builder examples/cpp/other/builder/builder.cpp) |
| 52 | +add_nvqpp_test(QAOABuilder examples/cpp/other/builder/qaoa_maxcut_builder.cpp) |
| 53 | +add_nvqpp_test(VQEH2Builder examples/cpp/other/builder/vqe_h2_builder.cpp) |
| 54 | +add_nvqpp_test(ComputeAction examples/cpp/other/compute_actions.cpp) |
| 55 | +add_nvqpp_test(Gradients examples/cpp/other/gradients.cpp) |
| 56 | +add_nvqpp_test(IterativePhaseEstimation applications/cpp/iterative_qpe.cpp) |
| 57 | +add_nvqpp_test(RandomWalkPhaseEstimation applications/cpp/random_walk_qpe.cpp) |
| 58 | + |
| 59 | +if (CUSTATEVEC_ROOT AND CUDA_FOUND) |
| 60 | + add_nvqpp_test(CuQuantumGHZ examples/cpp/basics/cuquantum_backends.cpp TARGET nvidia LABELS gpu_required) |
| 61 | + add_nvqpp_test(CuQuantumBernsteinVazirani applications/cpp/bernstein_vazirani.cpp TARGET nvidia LABELS gpu_required) |
| 62 | +endif() |
| 63 | + |
| 64 | +# code snippets in docs |
| 65 | +add_nvqpp_test(QuickStart_default quick_start.cpp SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp) |
| 66 | +add_nvqpp_test(FirstObserve using/first_observe.cpp SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp) |
| 67 | +add_nvqpp_test(FirstSample using/first_sample.cpp SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp) |
| 68 | +add_nvqpp_test(Timing using/time.cpp SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp APPLICATION_ARGS "10") |
| 69 | + |
| 70 | +set(NGPUS 0) |
| 71 | +if (CUSTATEVEC_ROOT AND CUDA_FOUND) |
| 72 | + add_nvqpp_test(QuickStart_nvidia quick_start.cpp TARGET nvidia LABELS gpu_required SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp) |
| 73 | + |
| 74 | + # mqpu snippets need custatevec backend and optionally MPI |
| 75 | + add_nvqpp_test(SampleAsync using/cudaq/platform/sample_async.cpp TARGET nvidia TARGET_OPTION mqpu LABELS gpu_required SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp) |
| 76 | + add_nvqpp_test(ObserveMQPU using/cudaq/platform/observe_mqpu.cpp TARGET nvidia TARGET_OPTION mqpu LABELS gpu_required SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp) |
| 77 | + add_nvqpp_test(StateAsyncMQPU using/cudaq/platform/get_state_async.cpp TARGET nvidia TARGET_OPTION mqpu LABELS gpu_required SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp) |
| 78 | + |
| 79 | + # Legacy check for the `nvidia-mqpu` target |
| 80 | + add_nvqpp_test(LegacySampleAsync using/cudaq/platform/sample_async.cpp TARGET nvidia-mqpu LABELS gpu_required SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp) |
| 81 | + add_nvqpp_test(LegacyObserveMQPU using/cudaq/platform/observe_mqpu.cpp TARGET nvidia-mqpu LABELS gpu_required SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp) |
| 82 | + add_nvqpp_test(LegacyStateAsyncMQPU using/cudaq/platform/get_state_async.cpp TARGET nvidia-mqpu LABELS gpu_required SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp) |
| 83 | + |
| 84 | + # Add the MPI test if MPI was found and there are more than 2 GPUs |
| 85 | + if (MPI_CXX_FOUND) |
| 86 | + # Count the number of GPUs |
| 87 | + find_program(NVIDIA_SMI "nvidia-smi") |
| 88 | + if(NVIDIA_SMI) |
| 89 | + execute_process(COMMAND bash -c "nvidia-smi --list-gpus | wc -l" OUTPUT_VARIABLE NGPUS) |
| 90 | + # Only build this test if we have more than 1 GPU |
| 91 | + if (${NGPUS} GREATER_EQUAL 2) |
| 92 | + add_nvqpp_test(ObserveMQPU_MPI using/cudaq/platform/observe_mqpu_mpi.cpp |
| 93 | + TARGET nvidia |
| 94 | + TARGET_OPTION mqpu |
| 95 | + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp |
| 96 | + LAUNCH_COMMAND "${MPIEXEC} --allow-run-as-root -np 2") |
| 97 | + add_nvqpp_test(LegacyObserveMQPU_MPI using/cudaq/platform/observe_mqpu_mpi.cpp |
| 98 | + TARGET nvidia-mqpu |
| 99 | + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp |
| 100 | + LAUNCH_COMMAND "${MPIEXEC} --allow-run-as-root -np 2") |
| 101 | + endif() |
| 102 | + endif(NVIDIA_SMI) |
| 103 | + endif() |
| 104 | +endif() |
| 105 | + |
| 106 | +add_nvqpp_test(photonics_sim targets/cpp/photonics.cpp TARGET orca-photonics) |
| 107 | +add_nvqpp_test(SampleAsyncRemote using/cudaq/platform/sample_async_remote.cpp TARGET remote-mqpu SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/cpp) |
| 108 | +set_tests_properties( |
| 109 | + nvqpp_SampleAsyncRemote |
| 110 | + PROPERTIES |
| 111 | + ENVIRONMENT_MODIFICATION PATH=path_list_append:${CMAKE_BINARY_DIR}/bin |
| 112 | +) |
| 113 | + |
| 114 | +# Only add the python tests if we built the python API |
| 115 | +if (CUDAQ_ENABLE_PYTHON) |
| 116 | + function(add_pycudaq_test TEST_NAME SOURCE_LOCATION) |
| 117 | + cmake_parse_arguments(PARSED_ARGS "" "LABELS;SOURCE_DIR;LAUNCH_COMMAND" "" ${ARGN}) |
| 118 | + if (NOT PARSED_ARGS_SOURCE_DIR) |
| 119 | + set(PARSED_ARGS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/sphinx/examples/python") |
| 120 | + endif() |
| 121 | + add_test( |
| 122 | + NAME |
| 123 | + pycudaq_${TEST_NAME} |
| 124 | + COMMAND |
| 125 | + bash -c "${PARSED_ARGS_LAUNCH_COMMAND} ${Python_EXECUTABLE} ${PARSED_ARGS_SOURCE_DIR}/${SOURCE_LOCATION}" |
| 126 | + ) |
| 127 | + set_tests_properties(pycudaq_${TEST_NAME} PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_BINARY_DIR}/python") |
| 128 | + if(PARSED_ARGS_LABELS) |
| 129 | + set_tests_properties(pycudaq_${TEST_NAME} PROPERTIES LABELS "${PARSED_ARGS_LABELS}") |
| 130 | + endif() |
| 131 | + endfunction() |
| 132 | + |
| 133 | + add_pycudaq_test(Intro intro.py) |
| 134 | + if (CUDA_FOUND) |
| 135 | + add_pycudaq_test(EvolveDynamics using/backends/dynamics.py LABELS gpu_required SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/python) |
| 136 | + endif() |
| 137 | + |
| 138 | + if (CUTENSORNET_ROOT AND CUDA_FOUND) |
| 139 | + # This example uses tensornet backend. |
| 140 | + add_pycudaq_test(SampleAsyncRemote using/cudaq/platform/sample_async_remote.py SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/python) |
| 141 | + endif() |
| 142 | + |
| 143 | + if (CUSTATEVEC_ROOT AND CUDA_FOUND) |
| 144 | + add_pycudaq_test(SampleAsync using/cudaq/platform/sample_async.py LABELS gpu_required SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/python) |
| 145 | + add_pycudaq_test(ObserveMQPU using/cudaq/platform/observe_mqpu.py LABELS gpu_required SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/python) |
| 146 | + if (MPI_CXX_FOUND AND ${NGPUS} GREATER_EQUAL 2) |
| 147 | + add_pycudaq_test(ObserveMQPU_MPI using/cudaq/platform/observe_mqpu_mpi.py |
| 148 | + LABELS "gpu_required;mgpus_required" |
| 149 | + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/snippets/python |
| 150 | + LAUNCH_COMMAND "${MPIEXEC} --allow-run-as-root -np 2") |
| 151 | + endif() |
| 152 | + endif() |
| 153 | +endif() |
0 commit comments