Skip to content

Instantly share code, notes, and snippets.

@gyu-don
Last active June 29, 2024 12:44
Show Gist options
  • Save gyu-don/6ddc6359b468e8fa34dec709ccd746a6 to your computer and use it in GitHub Desktop.
Save gyu-don/6ddc6359b468e8fa34dec709ccd746a6 to your computer and use it in GitHub Desktop.
Build `qiskit-aer` for ROCm (AMD GPU)

How to build Qiskit-aer for ROCm (AMD GPU)

Qiskit-aer is high-performance quantum computing simulators and ROCm is the computing platform for AMD GPUs like Radeon and Instinct.

As you know, the most powerful and prevalent GPU framework for numerical computation purposes today is NVIDIA CUDA, and AMD has been slow to develop software stacks for that application.

Qiskit-aer's GPU support is available through the cuQuantum library and its own implementation. The cuQuantum library can only run on NVIDIA GPUs. However, Qiskit-aer's own implementation can run on AMD GPUs.

Build

First, we prepare a clone of Qiskit-aer.

git clone https://github.com/Qiskit/qiskit-aer.git

We use Podman, which has a different architecture than Docker, but is used in much the same way. If you are not familiar with it, you may use Docker. Rye is a Python package manager.

FROM rocm/rocm-terminal:latest

ARG UID=1000
ARG GID=1000

RUN sudo apt update && \
    sudo apt install -y cmake libspdlog-dev libopenblas-dev python3-dev mpich ninja-build rocblas rocthrust && \
    sudo mkdir /work && \
    sudo chown $UID:$GID /work
USER $UID
WORKDIR /work
RUN curl -sSf https://rye.astral.sh/get | RYE_INSTALL_OPTION="--yes" bash 
COPY build.sh /work
CMD ["bash", "/work/build.sh"]

And, we prepare build script.

#!/bin/bash
PY_VERSION=3.11

# Change to workdir
cd /work

# Make and activate Python environment
source $HOME/.rye/env
rye init --virtual .
rye pin $PY_VERSION
rye add pybind11 scikit-build setuptools wheel
rye add "conan<2.0.0"
rye sync
. .venv/bin/activate

# Build qiskit-aer
cd /work/qiskit-aer
# You can add ROCm architecture to edit `-DAER_ROCM_ARCH=...`
# You can disable MPI to remove `-DAER_MPI=ON`
QISKIT_AER_PACKAGE_NAME='qiskit-aer-gpu-rocm' python3 setup.py bdist_wheel -- \
    -DCPPFLAGS+=-I.venv/lib/python${PY_VERSION}/site-packages/pybind11/include/ \
    -DAER_THRUST_BACKEND=ROCM -DAER_MPI=ON -DAER_ROCM_ARCH=gfx1101

Then, we run podman.

podman build . -t qiskit-aer-rocm
podman run -it --rm -v $PWD/qiskit-aer:/work/qiskit-aer --userns=keep-id qiskit-aer-rocm

Compiled binary file is created as wheel file in qiskit-aer/dist directory.

Run

Install a wheel.

pip install qiskit-aer/dist/qiskit_aer_gpu_rocm-0.15.0-cp311-cp311-linux_x86_64.whl

Run GPU simulator.

gpusim = AerSimulator(method='statevector', device='GPU')

circ = transpile(QuantumVolume(25, 25, seed=0), basis_gates=["rz", "sx", "ecr"])
circ.measure_all()
result = gpusim.run(circ, shots=10000).result()

The results are posted on benchmark.ipynb. In this result, GPU is 8x faster than CPU.

Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 21,
"id": "f340f1d2-ad92-417b-b8dc-32225fc793ba",
"metadata": {},
"outputs": [],
"source": [
"from qiskit import QuantumCircuit, transpile\n",
"from qiskit.circuit.library import QuantumVolume\n",
"from qiskit_aer import AerSimulator"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "f9481d36-8e05-421b-93db-f1c4249c15d1",
"metadata": {},
"outputs": [],
"source": [
"cpusim = AerSimulator(method='statevector', device='CPU')\n",
"gpusim = AerSimulator(method='statevector', device='GPU')\n",
"circ = transpile(QuantumVolume(28, 28, seed=0), basis_gates=[\"rz\", \"sx\", \"ecr\"])\n",
"circ.measure_all()"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "97536f61-dd14-4861-9150-bea14c6de4ac",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1min 8s, sys: 13.4 s, total: 1min 22s\n",
"Wall time: 5.78 s\n"
]
}
],
"source": [
"circ = transpile(QuantumVolume(25, 25, seed=0), basis_gates=[\"rz\", \"sx\", \"ecr\"])\n",
"circ.measure_all()\n",
"%time result = cpusim.run(circ, shots=10000).result()"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "fcd5e02e-7f50-4723-aa68-150040fa0a65",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 2min 26s, sys: 34.3 s, total: 3min\n",
"Wall time: 13.5 s\n"
]
}
],
"source": [
"circ = transpile(QuantumVolume(26, 26, seed=0), basis_gates=[\"rz\", \"sx\", \"ecr\"])\n",
"circ.measure_all()\n",
"%time result = cpusim.run(circ, shots=10000).result()"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "7deea9d7-8b46-4ac6-a5e9-5db553633000",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 5min 5s, sys: 1min 13s, total: 6min 18s\n",
"Wall time: 28.2 s\n"
]
}
],
"source": [
"circ = transpile(QuantumVolume(27, 27, seed=0), basis_gates=[\"rz\", \"sx\", \"ecr\"])\n",
"circ.measure_all()\n",
"%time result = cpusim.run(circ, shots=10000).result()"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "1c8991a6-dfad-4ec7-bfe7-5c6d4f20df67",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 13min 24s, sys: 1min 47s, total: 15min 12s\n",
"Wall time: 1min 4s\n"
]
}
],
"source": [
"circ = transpile(QuantumVolume(28, 28, seed=0), basis_gates=[\"rz\", \"sx\", \"ecr\"])\n",
"circ.measure_all()\n",
"%time result = cpusim.run(circ, shots=10000).result()"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "61fbce89-4af2-4fbe-ad28-8f5c60def8ec",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 25min 43s, sys: 2min 57s, total: 28min 41s\n",
"Wall time: 2min 2s\n"
]
}
],
"source": [
"circ = transpile(QuantumVolume(29, 29, seed=0), basis_gates=[\"rz\", \"sx\", \"ecr\"])\n",
"circ.measure_all()\n",
"%time result = cpusim.run(circ, shots=10000).result()"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "6de719ce-06fe-49a5-8557-6b335f85fd97",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 53min 59s, sys: 5min 41s, total: 59min 41s\n",
"Wall time: 4min 26s\n"
]
}
],
"source": [
"circ = transpile(QuantumVolume(30, 30, seed=0), basis_gates=[\"rz\", \"sx\", \"ecr\"])\n",
"circ.measure_all()\n",
"%time result = cpusim.run(circ, shots=10000).result()"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "14ddd83e-02cb-4c74-a329-dfbf434f4ff0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 929 ms, sys: 133 ms, total: 1.06 s\n",
"Wall time: 863 ms\n"
]
}
],
"source": [
"circ = transpile(QuantumVolume(25, 25, seed=0), basis_gates=[\"rz\", \"sx\", \"ecr\"])\n",
"circ.measure_all()\n",
"%time result = gpusim.run(circ, shots=10000).result()"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "6bfadfe2-4563-4f24-8cef-343487f5f81b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 2.29 s, sys: 2.65 s, total: 4.94 s\n",
"Wall time: 1.8 s\n"
]
}
],
"source": [
"circ = transpile(QuantumVolume(26, 26, seed=0), basis_gates=[\"rz\", \"sx\", \"ecr\"])\n",
"circ.measure_all()\n",
"%time result = gpusim.run(circ, shots=10000).result()"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "7d5f1bce-79da-46d3-a87e-ce59c2ce27dd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4.03 s, sys: 2.7 s, total: 6.73 s\n",
"Wall time: 3.6 s\n"
]
}
],
"source": [
"circ = transpile(QuantumVolume(27, 27, seed=0), basis_gates=[\"rz\", \"sx\", \"ecr\"])\n",
"circ.measure_all()\n",
"%time result = gpusim.run(circ, shots=10000).result()"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "52509d27-33cc-4d8d-9a88-e61c9adc7e0f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 8.66 s, sys: 2.71 s, total: 11.4 s\n",
"Wall time: 8.28 s\n"
]
}
],
"source": [
"circ = transpile(QuantumVolume(28, 28, seed=0), basis_gates=[\"rz\", \"sx\", \"ecr\"])\n",
"circ.measure_all()\n",
"%time result = gpusim.run(circ, shots=10000).result()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "a9417df0-20e3-4949-b59e-02720065a805",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 15.8 s, sys: 2.72 s, total: 18.5 s\n",
"Wall time: 15.4 s\n"
]
}
],
"source": [
"circ = transpile(QuantumVolume(29, 29, seed=0), basis_gates=[\"rz\", \"sx\", \"ecr\"])\n",
"circ.measure_all()\n",
"%time result = gpusim.run(circ, shots=10000).result()"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "53ba96ca-57d6-42e4-8388-87541b50fe6f",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"plt.style.use(\"seaborn-v0_8\")"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "6a5d126d-fc07-472b-b2c0-43b2d3351e64",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x74a5a088cad0>"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArgAAAHnCAYAAABT8C6QAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB0gklEQVR4nO3dd3hUZf7+8ffMpPdOTQgECBBaqIJUGyrYwPpTlBULYtn92tddC+IKuui6ilgR+4qiooAoIoKK9CJFeu8J6b3MnN8fgYGBkJ5Myf26Lq4k55w58xkeQu4885zPMRmGYSAiIiIi4iHMzi5ARERERKQuKeCKiIiIiEdRwBURERERj6KAKyIiIiIeRQFXRERERDyKAq6IiIiIeBQFXBERERHxKAq4IiIiIuJRvJxdgCtJTc1psOcym01ERASSnp6HzaZ7bbgjjaF70/i5P42h+9MYujdnjV90dHClx2gG10nMZhMmkwmz2eTsUqSGNIbuTePn/jSG7k9j6N5cefwUcEVERETEoyjgioiIiIhHUcAVEREREY+igCsiIiIiHkUBV0REREQ8igKuiIiIiHgUBVwRERER8SgKuCIiIiLiURRwRURERMSjKOCKiIiIiEdRwBURERERj6KAKyIiIiIexcvZBTQmhmGw/UAmmbnFRIb6cV5YQIM8b1racT788D1+/30px4+nEB4eQdu27bn++pvo1asP1157BUePHgHAz8+PuLhW3HLLX7jggosA+Ne/niE3N4dJk15yOO/atat54IFxzJ//M8HBwQ3yWkRERMT5DMNg674MSvZm4G2ChOYhmEwmZ5dlp4DbQNZsS+WLn3eSkllg39bsu61cNzSB7m2j6u15jxw5zD33jCUoKJh7732ANm3aUlpaysqVy3j55Rf49NMvAbjjjnFcccXV5OXl8dlnH/P0038nOjqaLl261VttIiIi4n7KyzQxYf5cN7QtPROjnVjZKVqi0ADWbEtl2uyNDv8QAI6k5fHalxtYsy213p77pZcmYzKZeOedDxgy5ELi4lrRpk0CN954C2+99b79uICAACIjo4iLa8WDDz6Gr68vS5f+Wm91iYiIiPs5V6ZJySxg2uyN9ZppqkMzuDWUX1jKkfS8So8zDINPF27HMM61Hz5duJ3QIO9Kp/abRQQS4Ff1IcvOzmLFimXcddd4/P39z9p/rmUFXl5eeHl5UVJSUuXnEhEREc9mGAZf/LyzwkzzxeKd9Ggf5fTlCgq4NZBfWMqjb/xOflFpnZwvI6eI5z9aW+lxAb5evHhP/yqH3IMHD2AYBnFx8VWupaSkhM8++5jc3Fx69uxd5ceJiIiIZ9t+IPOsmdszpWQUsONgFu1jwxqmqHNQwPVg5/oNqzxvvPEa77zzBsXFxfj7+zNu3H307z+g/ooTERERt5KZW1zF44rquZLKKeDWQIBf2UxqVZYo7D+Ww0c/bK/0uNHD2hPXpOJOBNVdohAbG4vJZGL//r2VHnvTTaO5/PIr8Pf3JyIi0uGthcDAQHuXhdPl5uZisVjKXf4gIiIiniUsyKeKx/nWcyWVU8CtoQA/LxKah1Z6XJtmIfyw4kCFU/ox4f4M6d6izterhISE0qdPP7766guuvfbGs4JoTk6OfR1uWFgYLVvGlnue2NhWLFy4gOLiYnx8Tv3j3r59K82aNcfLS/+MREREPF372DBiwvwrzTTtWlaej+qbuijUM5PJxHVD23Ku7GoywXVD2tbbYuwHH3wUm83KnXfexuLFP3HgwH727t3DF198xrhxf6nSOS655DJMJhPPPfc0W7du4eDBA8yd+w2ff/4/brzx5nqpW0RERFzLyUxz7v31m2mqQ1NvDaBnYjTjr+7CF4t3kpJxWh/cqECuG1K/fXBbtGjJ9Omf8OGH05k69RXS0o4TFhZOYmIHHnro8SqdIzg4mNdff4c335zK448/SF5eLi1axHL//f/HiBFX1VvtIiIi4lrimwZjNpuw2Rwv9IkJ9+e6Ia7TB9dkGNW5FMmzpabm1Ov5T97JLCuv7E5mfbu2IDMzn9JSW70+r9QPLy8z4eGBZGTkaQzdkMbP/WkM3Z/G0P1Mn/cnSzcexQTcdVUSocH+eJsN2jRruDuZRUdXfvdUzeA2IJPJRGJcOFD2Te0KU/giIiIiVXEwJZffNx4FYFD35pzfpZnL/oKiNbgiIiIiUqkvl+zCAHy8zFx5fmtnl1MhBVwRERERqdC2/Rn8sSsNgIt7xxIe7PxWYBVRwBURERGRczIMg1mLdwEQ6OfFZX1bObmiyingioiIiMg5rd1+nF2HswG4on98tW465SwKuCIiIiJSLqvNxpdLymZvI0P8GNqjpZMrqhoFXBEREREp128bjnA0PR+Aawa1xtvLPaKje1QpIiIiIg2qqMTK7N/2ANAyOojzOjV1ckVVp4ArIiIiImdZuPoAWbnFAFw7JAGz2X369yvgioiIiIiD3IISvlu+D4AOcWF0aRPh5Iqqx/Uvg/MghmGwM3MPWcXZRPiH0iesS4M8b1racT766H2WLfuN1NQUAgODaNmyJZdccjmXXTYCPz8/rr32Co4ePQKAn58fcXGtuOWWv3DBBRcB8K9/PUNubg6TJr3kcO61a1fzwAPjmD//Z4KDK791noiIiLi+ub/vpaDICsC1Q9q63d1XFXAbyPrUTXy9cx7HC9Ls25psjeaahMvpEplUb8976NBBxo8fS1BQMHfddS8JCW3x9vZm9+6dfPvt10RHRzNgwGAA7rhjHFdccTV5eXl89tnHPP3034mOjqZLl271Vp+IiIi4luNZBSxaexCAXonRtGke4uSKqk8BtwGsT93Euxs/wsBw2H4sN5W3/viQO7qMpnt053p57pdeegGLxYt33/0If39/+/YWLVoycOAQDONUTQEBAURGRhEZGcWDDz7GggXzWbr0VwVcERGRRmT2r3sotRqYTSZGDk5wdjk1ooBbQwWlBRzNS630OMMw+GL7N2eFW/t+yvaHeAdXOv3fNDAafy//Co85XVZWJqtWLeeuu+51CLenO9dzenl54eXlRUlJSZWfT0RERNzbgZRclm06CsCg7s1pGhHg5IpqxukB96233mLBggXs3r0bPz8/kpOTefjhh2nTpo39mNGjR7Ny5UqHx91www08++yz9q8PHz7MM888w4oVKwgICODqq6/moYcewsur7l9iQWkBT/4+mYLSgjo5X2ZRFi+tfb3S4/y9/JnY//Eqh9yDBw9iGAZxcY631Bs+/EKKi8uuirzmmusYP/4Bh/0lJSV89tnH5Obm0rNn7yq+ChEREXF3Xy7ZhQH4eJu58vx4Z5dTY04PuCtXruTmm2+mS5cuWK1WXn75ZcaOHcu8efMICDj1W8P111/PAw+cCmKnz0harVbuvvtuoqKi+Oyzz0hJSeGxxx7D29ubBx98sEFfjzt4++0PMAyDCRP+6TBD+8Ybr/HOO29QXFyMv78/48bdR//+A5xYqYiIiDSUrfsy2LCr7FqhS3rHERbk6+SKas7pAXf69OkOX0+ePJl+/fqxefNmevc+NXvo5+dHdHR0uef47bff2LlzJzNmzCAqKoqOHTvy17/+lSlTpnDffffh4+NTpzWfnEmtyhKFAzmHmLn960qPu7H9SFoGN6/wmOouUWjZsiUmk4n9+/c5bG/Rouw2e76+jv9wb7ppNJdffgX+/v5EREQ6LF8IDAy0d1k4XW5uLhaL5ZxLIERERMT1GYbBF4vLbskb5O/NZX3jnFxR7Tg94J4pJycHgNDQUIftc+bM4dtvvyU6OpqhQ4cyfvx4e6hav3497du3Jyoqyn78gAEDeOaZZ9i5cyedOnWq0nObzaYqNzEO9gok2C+w0uPaRrRi0YFfSD2te8KZYgKiGNKqX5234IiMjKBPn7589dXn3HjjTWeFUJPJhNkMXiduuxcREU58fKvyTkV8fDw//bQAm63U4ReGnTu30axZc/z86vaXCHdgsZgdPop70fi5P42h+9MYuo5VW46x50g2AFcNbE1wYOU/1115/Fwq4NpsNp5//nl69OhB+/bt7dtHjBhB8+bNiYmJYdu2bUyZMoU9e/YwdepUAI4fP+4QbgH716mplc+ynhQREVgvfd5u63EtL/3+tkPHgpNMJhO3Jo8iIiKozp8X4LnnJnLTTTcxduxo7r//fhITEzGZTGzcuJEDB/bRvXtXwsMDsVjM+Pv7EB5efmi/4YZrmTHjXSZNmsAdd9xBcHAwq1atYubMT3nkkUfO+bjGICREs9fuTOPn/jSG7k9j6FylVhtf/bIbgJiIAEZd2B5vL0uVH++K4+dSAXfChAns2LGDTz/91GH7DTfcYP88MTGR6OhoxowZw/79+4mLq7sp9PT0vHq5DV27wHbc3fVWvtoxj5T84/btTYOiGdluOO0C25GRkVfnzwsQHBzJ++9/wvvvv8e//z2FlJRj+Pj4EB/fhptuuoVRo64jIyMPq9VGQUFxBXVYeOONd3n99VcZN24cubm5tGwZywMPPMiwYVfUW/2uzGIxExLiT3Z2AVarzdnlSDVp/NyfxtD9aQxdw6I1BzmUWvZzfOTA1uTmFFbpcc4av6pMqrlMwH322WdZvHgxH3/8MU2bNq3w2G7dyvqy7tu3j7i4OKKiotiwYYPDMcePlwXJc63bLY/NZmCzld/Oq7a6RCbROaITOzP3kF2cTURAGL1bdyYzM5/S0vr9RxEWFsnf/vYIf/vbI+XuLy21MWvWHPvn59K8eSz/+te/z9putRpwjjZojYHVaqv3MZT6o/FzfxpD96cxdJ6iYitfn5i9jY0JoleHmGqPhSuOn9MXTRiGwbPPPsuPP/7IBx98QGxsbKWP2bJlC3AqvHbv3p3t27eTlnZqnevvv/9OUFAQbdu2rZ/Ca8BkMtEuvA09m3SnXXgbt7vtnYiIiHiWBasPkJVX1jr0uiEJmD0kmzh9BnfChAnMnTuXadOmERgYaF8zGxwcjJ+fH/v372fOnDkMHjyYsLAwtm3bxqRJk+jduzcdOnQAyi4oa9u2LY8++iiPPPIIqampvPLKK9x888113kFBRERExBPk5Bczf3lZp6WOrcJJah3h5IrqjtMD7v/+9z+g7GYOp5s0aRIjR47E29ubZcuW8eGHH5Kfn0+zZs245JJLGD9+vP1Yi8XCm2++yTPPPMMNN9yAv78/11xzjUPfXBERERE5Ze7v+ygstgJw7ZAEj3pn2ekBd9u2bRXub9asGR9//HGl52nRogXvvPNOXZUlIiIi4rFSMwtYtPYgAL07xNC6WYiTK6pbTl+DKyIiIiINa/avu7HaDCxmEyMHtXF2OXVOAVdERESkEdl/LIflm48BMKh7c5pEBDi5orqngCsiIiLSiMxavAsD8PW2cGX/eGeXUy8UcEVEREQaiT/3prNpTzoAw/rEEhrk6+SK6ocCroiIiEgjYDMMvli8C4DgAG+G9am7u8G6GgVcERERkUZg9dYU9h3NAeCK/vH4+zq9mVa9UcAVERER8XClVhtfLSm7JW9UqB9Dkls4uaL6pYArIiIi4uF++eMwKZkFAIwc3AYvi2dHQM9+dSIiIiKNXGFxKd/+tgeAuCZB9OnYxMkV1T8FXBEREREPtmDlAbLzSwC4bkhbzB50S95zUcAVERER8VDZecXMX7kfgE7x4SS1jnByRQ1DAVdERETEQ835fS9FxVYArh2S4ORqGo4CroiIiIgHSsnIZ/G6QwD06RhDfNMQJ1fUcBRwRURERDzQ17/uwWozsJhNjBzUxtnlNCgFXBEREREPs+9oDiv+PAbAkO4tiAkPcHJFDUsBV0RERMTDzFq8EwBfHwtXnB/v3GKcQAFXRERExINs3pPO5r0ZAFzaJ46QQB8nV9TwFHBFREREPITNMJi1eBcAIQHeXNI71skVOYcCroiIiIiHWLUlhX3HcgC44vzW+Pt6Obki51DAFREREfEApVYbX/1SNnsbE+bP4O7NnVyR8yjgioiIiHiAJesPk5pZCMDIwW3wsjTemNd4X7mIiIiIhygoKuXbpXsAaNU0mF4dYpxckXMp4IqIiIi4uR9W7icnvwSA64YkYDaZnFyRcyngioiIiLixrLxiflh5AICk1hF0io9wckXOp4ArIiIi4sbmLN1DUYkVgGsHJzi5GteggCsiIiLipo5l5LNk/WEAzuvUhFZNg51ckWtQwBURERFxU1//shurzcBiNnH1oDbOLsdlKOCKiIiIuKE9R7JZuSUFgKHJLYgJ83dyRa5DAVdERETEzRin3ZLXz8fCiPPjnVuQi1HAFREREXEzm/ems2VfBgCX9o0jJMDHyRW5FgVcERERETdiMwxm/Vw2exsS6MMlvWOdXJHrUcAVERERcSMr/zzG/pRcAK46Px4/Hy8nV+R6FHBFRERE3ERJqY2vftkNQEy4PwO7NXdyRa5JAVdERETETSxef4jjWYUAjBqcgJdFUa48+lsRERERcQMFRaXMWboXgNbNgumVGO3cglyYAq6IiIiIG/h+xX5yC0oAuHZIW0wmk5Mrcl0KuCIiIiIuLiu3iB9W7Qegc5sIOrYKd3JFrk0BV0RERMTFfbt0L8UlNkzAtYMTnF2Oy1PAFREREXFhR9PzWbL+MADnJTUhrkmwkytyfQq4IiIiIi7sq192YzMMvCwmrhnYxtnluAUFXBEREREXtftwNqu3pgAwNLklUWH+Tq7IPSjgioiIiLggwzCYtXgnAH4+Fkb0b+XkityHAq6IiIiIC9q0J52t+zMBuOy8VgQH+Di3IDeigCsiIiLiYmyGwRc/7wIgNNCHS3rFOrki96KAKyIiIuJiVmw+xsHUXACuGtAaXx+LkytyLwq4IiIiIi6kpNTGV7/sBqBJRAADujZzckXuRwFXRERExIX8vO4QadmFAIwa1AYvi+JadelvTERERMRF5BeWMvf3vQC0bhZCz8Ro5xbkphRwRURERFzE9yv3kVtQAsD1QxMwmUxOrsg9KeCKiIiIuIDM3CIWrDwAQNeESBLjwp1ckftSwBURERFxAd/+tofiUhsmYNTgBGeX49YUcEVERESc7EhaHr/8cQSAfp2bEhsT5OSK3JsCroiIiIiTffXLbmyGgZfFxNUDWzu7HLengCsiIiLiRLsOZbFmWyoAF/RoSVSov5Mrcn8KuCIiIiJOYhgGXywuuyWvv68XI/rHO7cgD6GAKyIiIuIkG3ensf1AJgCXnxdHkL+3cwvyEAq4IiIiIk5gsxnMOjF7Gxbkw0W9Yp1ckedQwBURERFxgmWbj3IwNQ+Aqwe2wdfb4uSKPIcCroiIiEgDKym1MvvX3QA0iwzg/C5NnVyRZ1HAFREREWlgi9YeIi27CCi7qYPFrEhWl/S3KSIiItKA8gtLmPv7XgASWoSQ3C7KuQV5IAVcERERkQY0f8V+8gpLAbhuSFtMJpOTK/I8Tg+4b731FqNGjSI5OZl+/foxfvx4du/e7XBMUVEREyZMoG/fviQnJ3P//fdz/Phxh2MOHz7MXXfdRbdu3ejXrx8vvPACpaWlDflSRERERCqUkVPEj6sOANC9bRTtY8OcW5CHcnrAXblyJTfffDOff/45M2bMoLS0lLFjx5Kfn28/5vnnn+fnn3/mlVde4aOPPiIlJYX77rvPvt9qtXL33XdTUlLCZ599xuTJk/n666959dVXnfGSRERERMr1zW97KC61YTLByMFtnF2OxzIZhmE4u4jTpaen069fPz7++GN69+5NTk4O/fr1Y8qUKVx66aUA7Nq1i8svv5yZM2fSvXt3lixZwrhx4/j111+Jiipbx/K///2PKVOmsGzZMnx8fKr03GlpuZjNDfM2gcViJiTEn+zsAqxWW4M8p9QtjaF70/i5P42h+2tsY3j4eB5/f2sZhgEDuzXjziuSnF1SrThr/MLDAys9xqsB6qiWnJwcAEJDQwHYtGkTJSUl9O/f335MQkICzZs3Z/369XTv3p3169fTvn17e7gFGDBgAM888ww7d+6kU6dOVXruiIjABl8HExKi+027O42he9P4uT+NoftrLGP4xjebMQzw9jLzlyu6EB7uGa/bFcfPpQKuzWbj+eefp0ePHrRv3x6A48eP4+3tTUhIiMOxkZGRpKam2o85PdwC9q9PHlMV6el5msGVKtMYujeNn/vTGLq/xjSGOw5msmzjEQAu7h2LFzYyMvKcXFXtaAa3iiZMmMCOHTv49NNPnfL8NpuBzdawKzasVhulpZ79Te3pNIbuTePn/jSG7s/Tx9AwDGYu3AFAgK8Xl/aJ86jX64rj5/SLzE569tlnWbx4MR988AFNm566m0dUVBQlJSVkZ2c7HJ+WlkZ0dLT9mDO7Kpz8+uQxIiIiIs7wx640th/MAmB4v1YE+Xs7uSLP5/SAaxgGzz77LD/++CMffPABsbGxDvs7d+6Mt7c3y5Yts2/bvXs3hw8fpnv37gB0796d7du3k5aWZj/m999/JygoiLZt2zbI6xARERE5k81m8OXiXQCEB/tyYc+WTq6ocXD6EoUJEyYwd+5cpk2bRmBgoH3NbHBwMH5+fgQHBzNq1CgmT55MaGgoQUFBPPfccyQnJ9sD7oABA2jbti2PPvoojzzyCKmpqbzyyivcfPPNVe6gICIiIlLXft90lEPHy9baXj2gNT7eFidX1Dg4PeD+73//A2D06NEO2ydNmsTIkSMBeOKJJzCbzTzwwAMUFxczYMAAnn76afuxFouFN998k2eeeYYbbrgBf39/rrnmGh544IGGeyEiIiIipykusfL1r2U3r2oeFUj/Lk0reYTUFZfrg+tMqak5DfZcXl5mwsMDycjIc7mF2VI1GkP3pvFzfxpD9+fpY/j9iv18/vNOAO4f1YXkdp51XZCzxi86OrjSY5y+BldERETE0+QVljBv2V4A2rYMpXvbqIofIHVKAVdERESkjn23bB95haUAXDckocFvJNXYKeCKiIiI1KH07EJ+XH0QgOR2UbRrGebcghohBVwRERGROjT7tz2UWm2YTDBycIKzy2mUFHBFRERE6sih1FyWnrgl74AuzWgRVfltZaXuKeCKiIiI1JEvl+zGMMDby8xVA1o7u5xGSwFXREREpA5sP5DJ+p3HAbioV0siQvycXFHjpYArIiIiUkuGYTDrxC15A/28uPy8Vk6uqHFTwBURERGppfU7jrPzUBYAw/vFE+jn7eSKGjcFXBEREZFasNpszFpSNnsbEeLLhT1bOLkiUcAVERERqYWlG49yJC0fgKsHtMHby+LkikQBV0RERKSGikqsfPPbHgBaRAXSv3NTJ1ckAF61eXB+fj5paWkUFhYSFhZGdHR0XdUlIiIi4vJ+WnOQjJwiAEYNScBs1i15XUG1A+62bdv4+uuvWbp0Kbt27cIwDPu+4OBgkpOTufTSS7n00kvx9/ev02JFREREXEVuQQnzlu0DoH3LULolRDq5IjmpygF33bp1vPzyy6xatYquXbvSv39/br/9dsLDw/Hx8SE7O5tDhw6xadMmJk+ezPPPP8/tt9/ObbfdRkBAQH2+BhEREZEG992yfRQUlQJw7dC2mEyavXUVVQ6448aNY/To0bzwwgs0b968wmNLS0v57bffmDFjBjabjXvvvbfWhYqIiIi4irSsQhauOQhAj/bRtG0R6uSK5HRVDriLFi0iMLBq91P28vJiyJAhDBkyhPz8/BoXJyIiIuKKZv+2m1KrDZMJRg1u4+xy5AxV7qJQ1XB7Ji1PEBEREU9yMCWX3zceBWBg1+Y0i6xZRpL6ozZhIiIiItXw5ZJdGICPl5mrBrR2djlSjjoPuElJSXTq1KmuTysiIiLidNv2Z/DHrjQALu4dS3iwr5MrkvLUqg9uea666iqH1mEiIiIinsAwDGYtLrslb6CfF5f1jXNyRXIudR5wn3/++bo+pYiIiIjTrd1+nF2HswEY0T+eAD9vJ1ck56I1uCIiIiKVsNpsfLmkbPY2MsSXC3q0cHJFUpEaBdyPPvqIKVOmlLtvypQpfPLJJ7UqSkRERMSV/LbhCEfTy1qfXj2wDd5eFidXJBWpUcD99NNPiYsrf91JfHw8n376aa2KEhEREXEVRSVWZv+2B4CW0YH0S2rq5IqkMjUKuIcPH6ZVq1bl7ouNjeXQoUO1KkpERETEVSxcfYCs3GIArh2SgNmsW/K6uhoF3KCgIA4ePFjuvgMHDuDn51erokRERERcQW5BCd8t3wdAYmwYXdpEOrkiqYoaBdzzzz+f119/nSNHjjhsP3r0KNOmTWPQoEF1UpyIiIiIM839fS8FRVYArh2agMmk2Vt3UKM2YQ899BA33HADl156Keeddx4xMTGkpKSwfPlyIiIieOihh+q6ThEREZEGdTyrgEVry96x7pkYTULzUCdXJFVVoxncJk2aMHv2bMaMGUNmZiYrV64kMzOTv/zlL3z99dc0adKkrusUERERaVCzf91DqdXAbDIxclAbZ5cj1VDjGz2EhYXxf//3f3VZi4iIiIhLOJCSy7JNRwEY1K0ZzSIDnVyRVEetbvSQlZXF6tWrmTNnDllZWQAUFRVhs9nqpDgRERERZ/hyyS4MwMfbzJUDWju7HKmmGs3gGobBf/7zHz766CMKCgowmUzMmjWL0NBQ7rvvPrp168Z9991X17WKiIiI1Lut+zLYsCsNgEt6xxIW5OvkiqS6ajSD+8orr/Dxxx/z2GOP8cMPP2AYhn3fBRdcwKJFi+qsQBEREZGGYhgGXywuuyVvkL83l/Ypv++/uLYazeB+/fXXPPjgg9x4441YrVaHfXFxcRw4cKBOihMRERFpSGu2pbLnSDYAI/rHE+BX48uVxIlqNIObmZlJQkJCufusViulpaW1KkpERESkoZVabXz5y24AIkP8GJrcwskVSU3VKODGx8ezdOnScvetXLmSdu3a1aooERERkYb224YjHEvPB2DkoDZ4e9XqWnxxohrNu48ZM4Ynn3wSLy8vLr30UqDsLmbr16/no48+YtKkSXVapIiIiEh9Kiq28s1vewCIjQmib5J6+ruzGgXckSNHkpWVxWuvvcZbb70FwL333ou/vz9/+9vfuPzyy+u0SBEREZH6tGD1AbLyigG4dkgCZt2S163VeOX0X/7yF66//nrWrVtHRkYGoaGhJCcnExwcXJf1iYiIiNSrnPxi5i/fB0CHuDA6t45wckVSW7W6NDAwMJABAwbUVS0iIiIiDW7u7/soLC7rCnXd0LaYNHvr9mq0evqXX35h7ty59q+PHDnCX/7yFwYNGsTjjz9Ofn5+nRUoIiIiUl9SMwtYtPYgAL06xNC6WYiTK5K6UKOA++qrr3Ls2DH7188++yy7du1i+PDh/Prrr7z66qt1VqCIiIhIfZn9626sNgOzycSoQW2cXY7UkRoF3H379tGhQwcAcnNz+fXXX3niiSd47LHHeOihh1iwYEGdFikiIiJS1/Yfy2H55rIJu8Hdm9MkIsDJFUldqVHALS0txWwue+iqVasAGDhwIACxsbEcP368jsoTERERqR+zluzCAHy8zVx5fryzy5E6VKOA26ZNG7799lvy8/OZOXMmycnJBAYGApCamkpYWFhd1igiIiJSp7bsTWfT7nQAhvWOIzTI18kVSV2qUcAdP348c+bMoWfPnvz222/cfffd9n2//vornTp1qrMCRUREROqSYRh8sXgXAEH+3lzaN87JFUldq1GbsAsvvJD58+fz559/kpiYSHx8vH1f9+7dSUxMrKv6REREROrU6m2p7D2aA8AV58fj71urrqnigmo8orGxscTGxp61/YYbbqhVQSIiIiL1pdRq48slZbO3UaF+DOnewskVSX2o8hKFJUuWVPvk6enpbN68udqPExEREakPv/5xmJSMAgBGDmqDt1eNVmuKi6vyqD799NNcddVVfPjhhw49cM9ktVpZtmwZ//jHP7jwwgv5888/66RQERERkdooLC7lm6V7AYiLCaJPpybOLUjqTZWXKCxYsIBPP/2UDz74gEmTJtGsWTPat29PREQE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M0ZrcF3EE088wfLly0lJSSE4OJjExETuvPNOzj//fODUjR7mzZvncKMHZ74brYArIiIiIh5F0xQiIiIi4lEUcEVERETEoyjgioiIiIhHUcAVEREREY+igCsiIiIiHkUBV0REREQ8igKuiIiIiHgUBVwRERER8SgKuCJSqddee43ExERuvvnms/b961//cvv7xb///vsMGTKEjh07Mn78+AZ5zsTERKZPn17hMStWrCAxMZGNGzfat7322musXbu2vsurE9X5t/HLL78wZswYevXqRbdu3bjmmmv45JNPsFqt9mMmTpxIjx49KCwsLPccixYtIjExkWXLllWrzvHjxzN69OhqPaaqDh48yGuvvcaxY8cctpc3tiJSdxRwRaTKVq9ezYoVK5xdRp3au3cvkydP5oorruCTTz7hkUcecXZJdklJScycOZOEhAT7tqlTp7Ju3TonVlX33nvvPe68806CgoJ48cUXefPNNznvvPOYNGkSDz74ICdvuDlixAjy8vL4+eefyz3PvHnziImJoW/fvg1ZfoUOHTrE1KlTSUlJcXYpIo2Kl7MLEBH3EBAQQNu2bZk2bZpLBYja2rNnD4ZhcP311xMbG+vschwEBQXRvXt3Z5dRr/7880+mTJnCNddcw+TJk+3b+/XrR9u2bXniiSeYOXMmN954I8nJycTGxjJ37lwuu+wyh/Pk5+ezaNEibrjhBsxmzd2INHb6X0BEqmz8+PEsX768wrfIv/rqKxITE0lPT3fYftVVV/H444/bv3788ccZMWIEv//+O1dccQVdu3bllltu4eDBg2RmZvLXv/6VHj16cNFFF/Hdd9/VqN6ioiImTZrEgAED6NKlC1dddRU//vijQw3jxo0D4KKLLiIxMZGvvvrqnOdbu3YtI0eOpEuXLowYMYIlS5ac9bpGjx7N3Xff7fC4LVu2kJiYeNbst9Vq5cUXX+S8884jOTmZxx9/nNzcXPv+M9/GTkxMBODFF18kMTHR4ZyzZs1i+PDhdO3alb59+3LTTTexYcOGCv9+pkyZwhVXXEFycjIDBw7kwQcfPGum8eTr+f777xk2bBjJycnceuut7N+/3+G4Y8eOMW7cOLp168bAgQN55513Knzukz766CNMJhP333//WfuuueYa4uPjmTFjhn3b8OHD+eWXX8jJyXE4dtGiReTn53PFFVdU+Hy7du3illtuoUuXLlx00UV8/fXX5zzunnvuoWfPnnTv3p277rrrrNecmJjI22+/fc4xXLFiBbfeeisA1157rX3MTpednc1DDz1EcnIyQ4cOrfLfm4hUTDO4IlJlQ4cOpVOnTrz++uuVrh+titTUVCZPnsw999yDl5cXzz33HA8//DD+/v706tWL66+/ns8//5xHHnmEbt260aJFi2qd/+GHH+bXX3/lb3/7G23atOGbb77h/vvv5/XXX+fCCy9k/PjxJCQkMGXKFKZOnUp0dDRxcXHnrHXs2LEkJibyyiuvkJ2dzYQJE8jPz6djx441ev0fffQRSUlJvPDCCxw8eJApU6ZQVFTEf/7zn3KPnzlzJjfccAOjR49mxIgRALRt25ZVq1bxj3/8g9tvv53BgwdTWFjIhg0bzgqBZ0pLS+Puu+8mJiaG9PR0ZsyYwejRo5k3bx5eXqd+PGzZsoX09HQefvhhrFYrkydP5pFHHmHmzJn2Y8aPH8+xY8d45plnCA4O5p133uHIkSMO5ynPqlWrSExMLHdszWYzQ4cOZcaMGaSkpBATE8MVV1zBm2++yQ8//MC1115rP3bu3Lm0adOGpKSkcz5XUVERt99+O/7+/rz44osAvPrqq+Tm5hIfH28/7sCBA9x44420a9eOyZMnYzKZePPNNxkzZgzff/89Pj4+9mMrGsOkpCSeeuopnn32WSZNmkSbNm3Oqunpp5/mqquu4vXXX2fhwoVMmTKFxMREBg0aVOHfm4hUTAFXRKrlnnvu4f7772fDhg107dq1VufKysri448/pl27dgCkpKQwceJE7rzzTu69914AunTpwo8//sjChQu57bbbqnzurVu3smDBAiZMmMCNN94IwKBBgzh06JA94MbFxdG6dWsAOnbsSMuWLc95vg8++ACTycQ777xDcHAwAE2bNmXMmDE1eekA+Pj48Prrr2OxWADw9fXln//8J/fdd5/DutuTTi5XaNasmcPShQ0bNhAWFsZjjz1m3zZkyJBKn3/SpEn2z61WK8nJyQwaNIjly5czYMAA+76cnBxmz55NREQEULYc4O9//ztHjx6ladOm/PLLL2zatIn333+ffv36AdC3b18GDx5MWFhYhTUcO3bsrFnN0zVr1gyAo0ePEhMTQ9u2benYsSPz5s2zB9zMzEx+++037rnnngqf66uvviIlJYX58+fbA22n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",
"text/plain": [
"<Figure size 800x550 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"cpu_n = [25, 26, 27, 28, 29, 30]\n",
"cpu_t = [5.78, 13.5, 28.2, 64, 122, 266]\n",
"gpu_n = [25, 26, 27, 28, 29]\n",
"gpu_t = [0.863, 1.8, 3.6, 8.28, 15.4]\n",
"\n",
"plt.plot(cpu_n, cpu_t, \"o-\", label=\"CPU\")\n",
"plt.plot(gpu_n, gpu_t, \"o-\", label=\"GPU\")\n",
"plt.xlabel(\"Num. of qubits and QV depth\")\n",
"plt.ylabel(\"Wallclock time (sec.)\")\n",
"plt.legend()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
#!/bin/bash
PY_VERSION=3.11
# Change to workdir
cd /work
# Make and activate Python environment
source $HOME/.rye/env
rye init --virtual .
rye pin $PY_VERSION
rye add pybind11 scikit-build setuptools wheel
rye add "conan<2.0.0"
rye sync
. .venv/bin/activate
# Build qiskit-aer
cd /work/qiskit-aer
QISKIT_AER_PACKAGE_NAME='qiskit-aer-gpu-rocm' python3 setup.py bdist_wheel -- \
-DCPPFLAGS+=-I.venv/lib/python${PY_VERSION}/site-packages/pybind11/include/ \
-DAER_THRUST_BACKEND=ROCM -DAER_MPI=ON -DAER_ROCM_ARCH=gfx1101
cp dist/*.whl ../dist
podman build . -t qiskit-aer-rocm
podman run -it --rm -v $PWD/qiskit-aer:/work/qiskit-aer --userns=keep-id qiskit-aer-rocm
FROM rocm/rocm-terminal:latest
ARG UID=1000
ARG GID=1000
RUN sudo apt update && \
sudo apt install -y cmake libspdlog-dev libopenblas-dev python3-dev mpich ninja-build rocblas rocthrust && \
sudo mkdir /work && \
sudo chown $UID:$GID /work
USER $UID
WORKDIR /work
RUN curl -sSf https://rye.astral.sh/get | RYE_INSTALL_OPTION="--yes" bash
COPY build.sh /work
CMD ["bash", "/work/build.sh"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment