Table of Contents

Measurement and Readout

Measurement collapses qubits to classical bits. In CUDA-Q, use mz(qubit) (measure in Z basis) to get bitstrings. Collect many shots to build probability distributions.

#include "cudaq.h"
 
// Measure specific qubits
struct SelectiveMeasure {
  void operator()() __qpu__ {
    cudaq::qvector q(3);
    h(q[0]);
    cx(q[0], q[1]);
 
    mz(q[0]);      // Measure qubit 0 only
    mz(q[1], q[2]); // Measure qubits 1, 2
  }
};
 
// Measure all qubits
struct MeasureAll {
  void operator()() __qpu__ {
    cudaq::qvector q(2);
    h(q[0]);
    cx(q[0], q[1]);
    mz(q);  // Measure all qubits in vector
  }
};
 
// Multiple measurements (mid-circuit)
struct MidCircuitMeasure {
  void operator()() __qpu__ {
    cudaq::qvector q(2);
    h(q[0]);
 
    mz(q[0]);  // Measure q[0]
 
    // Classical conditional: if q[0] is 1, apply X
    if (__qpu_measure(q[0])) {
      x(q[1]);
    }
 
    mz(q[1]);  // Measure q[1]
  }
};
 
int main() {
  // Collect samples
  auto result = cudaq::sample<MeasureAll>(1000);
 
  // Process results
  for (auto& [bitstring, count] : result) {
    double probability = double(count) / 1000.0;
    printf("Bitstring %s: %.3f probability\n", bitstring.c_str(), probability);
  }
 
  // Get specific probabilities
  printf("P(00) = %.3f\n", result.probability("00"));
  printf("P(11) = %.3f\n", result.probability("11"));
 
  return 0;
}

Measurement is irreversible—after measuring, the quantum state collapses to the measured value. Running multiple shots approximates the quantum probability distribution.