Introduction -------------------------------- Welcome to CUDA Quantum! On this page we will illustrate CUDA Quantum with several examples. .. tab:: Python We're going to take a look at how to construct quantum programs through CUDA Quantum's `Kernel` API. When you create a `Kernel` and invoke its methods, a quantum program is constructed that can then be executed by calling, for example, `cudaq::sample`. Let's take a closer look! .. literalinclude:: ../../examples/python/intro.py :language: python .. tab:: C++ We're going to take a look at how to construct quantum programs using CUDA Quantum kernels. CUDA Quantum kernels are any typed callable in the language that is annotated with the :code:`__qpu__` attribute. Let's take a look at a very simple "Hello World" example, specifically a CUDA Quantum kernel that prepares a GHZ state on a programmer-specified number of qubits. .. literalinclude:: ../../examples/cpp/basics/static_kernel.cpp :language: cpp Here we see that we can define a custom :code:`struct` that is templated on a :code:`size_t` parameter. Our kernel expression is free to use this template parameter in the allocation of a compile-time-known register of qubits. Within the kernel, we are free to apply various quantum operations, like a Hadamard on qubit 0 :code:`h(q[0])`. Controlled operations are **modifications** of single-qubit operations, like the :code:`x(q[0],q[1])` operation which implements a controlled-X gate. We can measure single qubits or entire registers. In this example we are interested in sampling the final state produced by this CUDA Quantum kernel. To do so, we leverage the generic :code:`cudaq::sample` function, which returns a data type encoding the qubit measurement strings and the corresponding number of times that string was observed (here the default number of shots is used, :code:`1000`). The following example illustrates how to compile and execute this code. .. code:: bash nvq++ static_kernel.cpp -o ghz.x ./ghz.x