2. Qulacs

2.1. はじめに

量子回路の高速シミュレーション用の Python/C++ ライブラリであるQulacsについての「富岳」での利用方法を利用例を交えて説明します。

「富岳」でサポートしているQulacsのバージョンは、v0.5.5です。

Qulacsの詳細につきましては、 Qulacsの公式サイト をご参照ください。


2.2. 利用方法

利用するにあたり、高性能計算向けのソフトウェアパッケージ管理システム(Spack)を利用します。


2.2.1. Spack環境の準備

利用手引書 富岳 Spack 利用ガイド に基づいてSpack環境を構築します。

本ドキュメントでは、「パブリックインスタンスの利用」を想定してQulacsの利用法を解説します。


2.2.2. Qulacsのロード

Qulacsを使用する場合、下記のコマンドでロードします。

$ spack load qulacs %fj

2.2.3. Qulacsのアンロード

Qulacsを使用しない場合、下記のコマンドでアンロードします。

$ spack unload qulacs %fj

2.3. 利用例

「富岳」においてバッチジョブでQulacsを実行する場合の例を示します。

ここでは例として、次の典型的な量子もつれ状態であるBell状態と呼ばれる量子状態を作るサンプルプログラム(main.cpp)を使用します。

$ cat main.cpp
#include <iostream>
#include <cppsim/state.hpp>
#include <cppsim/circuit.hpp>
#include <cppsim/observable.hpp>
#include <cppsim/gate_factory.hpp>
#include <cppsim/gate_merge.hpp>

int main(){
    QuantumState state(2);
    state.set_computational_basis(0b00);

    QuantumCircuit circuit(2);
    circuit.add_H_gate(0);
    circuit.add_CNOT_gate(0,1);
    circuit.update_quantum_state(&state);

    std::cout << state << std::endl;

    Observable observable(2);
    observable.add_operator(1.0, "Z 1 X 0");

    auto value = observable.get_expectation_value(&state);
    std::cout << value << std::endl;

    return 0;
}

2.3.1. バッチジョブスクリプトの作成

「富岳」でQulacsをバッチジョブで実行するための例として、次のジョブスクリプト(run.sh)を示します。

※ シングルアカウントの場合は、run.shに実行グループid(idコマンドで確認)の指定が必要。

(例:#PJM -g hp*****)

$ cat run.sh
#!/bin/sh
#PJM -g hp*****
#PJM -L "node=1"
#PJM -L "rscgrp=small"
#PJM -L "elapse=00:20:00"
#PJM --mpi "max-proc-per-node=12"
#PJM -x PJM_LLIO_GFSCACHE=/vol0004
#PJM -S

export PATH=/opt/FJSVxtclanga/tcsds-1.2.36/bin:$PATH
export LD_LIBRARY_PATH=/opt/FJSVxtclanga/tcsds-1.2.36/lib64:$LD_LIBRARY_PATH
. /vol0004/apps/oss/spack/share/spack/setup-env.sh
spack load qulacs %fj

FCC -Nclang -O2 main.cpp -fopenmp -lcppsim_static -lcsim_static
./a.out

2.3.2. バッチジョブスクリプトの実行

下記のコマンドで実行します。

$ pjsub run.sh

2.3.3. 結果の確認

run.sh.job-id.outファイルにおいて、下記の結果が得られた場合、Qulacsは問題なく動作しています。

 *** Quantum State ***
 * Qubit Count : 2
 * Dimension   : 4
 * State vector :
(0.707107,0)
       (0,0)
       (0,0)
(0.707107,0)

(0,0)