common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Overview
Contact
Event
Project
Research

Terms of service (Web service)

Terms of service (Quantum and ML Cloud service)

Privacy policy


Sign in
Sign up
common.title

ノートPCに最新のNVIDIA cuQuantumを入れてpythonで状態ベクトルをいじる

Yuichiro Minato

2022/11/02 10:56

NVIDIA cuQuantumって手元のPCでも動くんですか?という質問をいただきましたので、入れて実行してみました。手元のPCはGTX1650のゲーミングノートPCです。やり方は簡単です。

pip install cuquantum-python

これで終わりです。インストールができたら早速使ってみましょう。cupyを要求された場合にはそちらも入れる必要があります。

import numpy as np
import cupy as cp

import cuquantum
from cuquantum import custatevec as cusv

nIndexBits = 3
nSvSize    = (1 << nIndexBits)
nTargets   = 1
nControls  = 2
adjoint    = 0

targets    = np.asarray([2], dtype=np.int32)
controls   = np.asarray([0, 1], dtype=np.int32)

h_sv       = np.asarray([0.0+0.0j, 0.0+0.0j, 0.0+0.0j, 0.0+0.0j,
                         0.0+0.0j, 0.0+0.0j, 0.0+0.0j, 1.0+0.0j], dtype=np.complex64)

# the gate matrix can live on either host (np) or device (cp)
matrix     = cp.asarray([0.0+0.0j, 1.0+0.0j, 1.0+0.0j, 0.0+0.0j], dtype=np.complex64)

if isinstance(matrix, cp.ndarray):
    matrix_ptr = matrix.data.ptr
elif isinstance(matrix, np.ndarray):
    matrix_ptr = matrix.ctypes.data
else:
    raise ValueError

d_sv = cp.asarray(h_sv)

####################################################################################

# cuStateVec handle initialization
handle = cusv.create()
workspaceSize = cusv.apply_matrix_get_workspace_size(
    handle, cuquantum.cudaDataType.CUDA_C_32F, nIndexBits, matrix_ptr, cuquantum.cudaDataType.CUDA_C_32F,
    cusv.MatrixLayout.ROW, adjoint, nTargets, nControls, cuquantum.ComputeType.COMPUTE_32F)

# check the size of external workspace
if workspaceSize > 0:
    workspace = cp.cuda.memory.alloc(workspaceSize)
    workspace_ptr = workspace.ptr
else:
    workspace_ptr = 0

# apply gate
cusv.apply_matrix(
    handle, d_sv.data.ptr, cuquantum.cudaDataType.CUDA_C_32F, nIndexBits, matrix_ptr, cuquantum.cudaDataType.CUDA_C_32F,
    cusv.MatrixLayout.ROW, adjoint, targets.ctypes.data, nTargets, controls.ctypes.data, 0, nControls,
    cuquantum.ComputeType.COMPUTE_32F, workspace_ptr, workspaceSize)

# destroy handle
cusv.destroy(handle)

print(d_sv)
[0.+0.j 0.+0.j 0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]

ということで、CCXを|111>にかけてみましたところ、無事|011>となりました。サクッと計算できていいですね。GPUたくさんありますので今後はでかいのでチャレンジしてみます。

© 2025, blueqat Inc. All rights reserved