量子裝置仍然是一項新興技術,不幸的是,並非所有裝置都可以執行每個 Q# 程式。 因此,在開發量子程式時,您需要牢記一些限制。 target配置檔類型會定義您target使用 Q# 程式的量子裝置功能。 Quantum 開發套件 (QDK) 有一組不同的 target 配置檔類型,可共同支援 Azure Quantum 中可用的目前量子裝置的所有功能。
本文討論 Azure Quantum 中不同類型的 target 設定檔、其限制,以及如何在 QDK 中設定它們。
目標個人檔案和其限制
目前,Azure Quantum 和 QDK 會根據其執行target的能力來管理不同的QIR配置檔。
- Unrestricted: 此配置檔可以在模擬器的記憶體限制內或實體量子電腦的量子位元數目範圍內執行任何程式,包括任何 Q# 程式。
-
Base: 此設定檔可以執行任何不需要使用量子位測量結果的 Q# 程式來控制程式流程。 在以此類 QPU 為目標的 Q# 程式中,類型的
Result值不支援相等比較。 -
Adaptive RI: 此配置檔在使用量子比特測量結果來控制程式流程方面能力有限。 在以這種 QPU 為目標的 Q# 程式中,您可以在作業中比較類型
Result的值,作為if陳述式條件的一部分,以實現中途電路測量。 - Adaptive RIF: 此設定檔具有與設定檔相同的 Adaptive RI 功能,但也支援浮點運算。
建立並執行 Unrestrictedtarget 配置檔的程式
Unrestricted target 設定檔可以執行所有 Q# 程式,因此您可以撰寫 Q# 程式碼,而不需要考慮功能限制。 Azure Quantum 不提供任何支援此配置檔的實際裝置 targets 。 不過,您可以在 QDK 隨附的模擬器上執行 Unrestricted 具有此配置檔的 Q# 程式。
設定 Unrestrictedtarget 設定檔
如果您未手動設定 QIRtarget 設定檔,則編譯器會自動為您設定 target 設定檔。 編譯器會選擇最嚴格的配置檔,仍可讓您的程式在您選擇的 Azure Quantum 裝置上 target 執行。
若要手動將 QIRtarget 設定檔設定為 Unrestricted,請選擇下列其中一個選項:
如果您設定 Q# 專案,請將下列命令新增至專案的
qsharp.json檔案:{ "targetProfile": "unrestricted" }如果您正在處理不屬於 Q# 專案的檔案,
.qs請直接在 Q# 程式碼中設定 target 設定檔。 若要這樣做,請在程式中的進入點作業之前包含@EntryPoint(Unrestricted),即使該作業是預設Main值。在 Python 中,呼叫方法
qdk.init來設定 target 設定檔。from qdk import init, TargetProfile init(target_profile=TargetProfile.Unrestricted)
建立並執行 Basetarget 配置檔的程式
Base
target 配置檔可以執行各種不同的 Q# 應用程式,其條件約束是無法使用量子位測量的結果來控制程式流程。 更具體來說,類型的 Result 值不支援相等比較。
例如,您無法執行FlipQubitOnZero操作在Basetarget上。
@EntryPoint(Base)
operation FlipQubitOnZero() : Unit {
use q = Qubit();
if M(q) == Zero {
X(q);
}
}
當您在 FlipQubitOnZeroBase 上執行此程式碼時,target 操作將失敗,因為 target 裝置無法在量子演算法運行期間利用量子位測量結果來執行條件邏輯。 如果您打算在 Basetarget 裝置上執行演算法,請確定您的程式碼不包含任何 if 依賴測量量子位元來評估邏輯條件的 條件式分支 區塊。
設定 Basetarget 設定檔
若要手動將 QIRtarget 設定檔設定為 Base,請選擇下列其中一個選項:
如果您設定 Q# 專案,請將下列命令新增至專案的
qsharp.json檔案:{ "targetProfile": "base" }如果您正在處理不屬於 Q# 專案的檔案,
.qs請直接在 Q# 程式碼中設定 target 設定檔。 若要這樣做,請在程式中的進入點作業之前包含@EntryPoint(Base),即使該作業是預設Main值。在 Python 中,呼叫方法
qdk.init來設定 target 設定檔。from qdk import init, TargetProfile init(target_profile=TargetProfile.Base)
targets 支援 Basetarget 設定檔
目前,Azure Quantum 提供下列 Basetargets的存取:
| Provider | 模擬器 | QPU |
|---|---|---|
| IonQ | ionq.simulator |
ionq.qpu.* |
| Rigetti | rigetti.sim.* |
rigetti.qpu.* |
若要深入瞭解 Azure Quantum 中的這些提供者,請參閱 IonQ 提供者 和 Rigetti 提供者。
建立並執行 Adaptive RItarget 配置檔的程式
Adaptive RI target 配置檔可以執行比 Base 配置檔更廣泛的 Q# 應用程式,但仍有一些限制。 與設定檔不同 Basetarget , Adaptive RItargets 支援中間電路測量。
透過中途電路測量,您可以在量子程式中的任何點選擇性地測量量子位元,而不限於結束。 然後,您可以將測量結果用於程式中的其他運算,例如以 if 區塊執行條件分支。 您測量中間電路的量子位會崩潰為經典狀態 (零或一),但未測量的量子位仍會保持其量子狀態。
當您在 Q# 中測量量子位時,會傳回類型的 Result 值。 如果您想要在條件語句中使用這個結果,則必須直接在條件語句中比較。 對應的條件式區塊不能包含 return 或 set 語句。
例如,下列 Q# 程式碼允許在 :Adaptive RItarget
@EntryPoint(Adaptive_RI)
operation MeasureQubit(q : Qubit) : Result {
return M(q);
}
operation SetToZero(q : Qubit) : Unit {
if MeasureQubit(q) == One { X(q); }
}
設定 Adaptive RItarget 設定檔
若要手動將 QIRtarget 設定檔設定為 Adaptive RI,請選擇下列其中一個選項:
如果您設定 Q# 專案,請將下列命令新增至專案的
qsharp.json檔案:{ "targetProfile": "adaptive_ri" }如果您正在處理不屬於 Q# 專案的檔案,
.qs請直接在 Q# 程式碼中設定 target 設定檔。 若要這樣做,請在程式中的進入點作業之前包含@EntryPoint(Adaptive_RI),即使該作業是預設Main值。在 Python 中,呼叫方法
qdk.init來設定 target 設定檔。from qdk import init, TargetProfile init(target_profile=TargetProfile.Adaptive_RI)
targets 支援 Adaptive RItarget 設定檔
目前,Quantinuum 是 Azure Quantum 中唯一具有 Adaptive RItargets的提供者。
-
模擬器:
quantinuum.sim.h2-1e和quantinuum.sim.h2-2e -
QPU:
quantinuum.qpu.h2-1和quantinuum.qpu.h2-2
如需 Azure Quantum 中 Quantinuum 供應專案的詳細資訊,請參閱 Quantinuum 模擬器。
建立並執行 Adaptive RIFtarget 配置檔的程式
Adaptive RIF target 設定檔具有 Adaptive RI 設定檔的所有功能,並且支援包含浮點計算的 Q# 程式。
例如,下列 Q# 程式碼允許在 :Adaptive RIFtarget
@EntryPoint(Adaptive_RIF)
operation DynamicFloat() : Double {
use q = Qubit();
H(q);
mutable f = 0.0;
if M(q) == One {
f = 0.5;
}
Reset(q);
return f;
}
設定 Adaptive RIFtarget 設定檔
若要手動將 QIRtarget 設定檔設定為 Adaptive RIF,請選擇下列其中一個選項:
如果您設定 Q# 專案,請將下列命令新增至專案的
qsharp.json檔案:{ "targetProfile": "adaptive_rif" }如果您正在處理不屬於 Q# 專案的檔案,
.qs請直接在 Q# 程式碼中設定 target 設定檔。 若要這樣做,請在程式中的進入點作業之前包含@EntryPoint(Adaptive_RIF),即使該作業是預設Main值。在 Python 中,呼叫方法
qdk.init來設定 target 設定檔。from qdk import init, TargetProfile init(target_profile=TargetProfile.Adaptive_RIF)
targets 支援 Adaptive RIFtarget 設定檔
目前,Azure Quantum 沒有 Adaptive RIFtargets。 不過,您可以在 QDK 的本機模擬器上執行 的 Adaptive RIFtargets 程式。