Skip to content

Commit 39cb134

Browse files
committed
Always build the CPU variant of controller_wrappers such that CUDA build can still run on CPU
1 parent c533946 commit 39cb134

File tree

3 files changed

+65
-21
lines changed

3 files changed

+65
-21
lines changed
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import importlib
2+
3+
_loaded_backend_module = None
4+
5+
6+
def try_import_backend(backend_module_suffix):
7+
module_name = f".controller_wrappers_{backend_module_suffix}"
8+
try:
9+
return importlib.import_module(module_name)
10+
except ImportError:
11+
return None
12+
13+
14+
BACKENDS = ["cuda", "rocm", "cpu"]
15+
16+
for backend_suffix in BACKENDS:
17+
_loaded_backend_module = try_import_backend(backend_suffix)
18+
if _loaded_backend_module:
19+
break
20+
21+
if _loaded_backend_module is None:
22+
raise ImportError("No backend found for qiskit-aer.")
23+
24+
25+
def __getattr__(name):
26+
return getattr(_loaded_backend_module, name)

qiskit_aer/backends/wrappers/CMakeLists.txt

+38-20
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,36 @@ if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_HOST_SYSTEM_PROCESSOR
2020
endif()
2121
endif()
2222

23-
set(AER_SIMULATOR_SOURCES "bindings.cc" "${SIMD_SOURCE_FILE}")
24-
basic_pybind11_add_module(controller_wrappers "${AER_SIMULATOR_SOURCES}")
23+
macro(configure_target target_name)
24+
target_include_directories(${target_name} PRIVATE ${AER_SIMULATOR_CPP_SRC_DIR}
25+
PRIVATE ${AER_SIMULATOR_CPP_EXTERNAL_LIBS})
26+
target_link_libraries(${target_name} ${AER_LIBRARIES})
27+
target_compile_definitions(${target_name} PRIVATE ${AER_COMPILER_DEFINITIONS})
28+
install(TARGETS ${target_name} LIBRARY DESTINATION qiskit_aer/backends)
29+
endmacro()
2530

31+
# Build the CPU backend
32+
set(BACKEND_MODULE_NAME "controller_wrappers_cpu")
33+
configure_file(bindings.cc.in bindings_cpu.cc)
34+
basic_pybind11_add_module(controller_wrappers_cpu bindings_cpu.cc "${SIMD_SOURCE_FILE}")
35+
36+
if(DEFINED SIMD_SOURCE_FILE)
37+
string(REPLACE ";" " " SIMD_FLAGS "${SIMD_FLAGS_LIST}")
38+
set_source_files_properties(${SIMD_SOURCE_FILE} PROPERTIES COMPILE_FLAGS "${SIMD_FLAGS}")
39+
endif()
40+
41+
set_target_properties(controller_wrappers_cpu PROPERTIES COMPILE_FLAGS "${AER_COMPILER_FLAGS}")
42+
configure_target(controller_wrappers_cpu)
43+
44+
# Build the CUDA backend
2645
if(AER_THRUST_BACKEND STREQUAL "CUDA")
46+
set(BACKEND_MODULE_NAME "controller_wrappers_cuda")
47+
configure_file(bindings.cc.in bindings_cuda.cc)
48+
basic_pybind11_add_module(controller_wrappers_cuda bindings_cuda.cc "${SIMD_SOURCE_FILE}")
49+
2750
include(nvcc_add_compiler_options)
28-
set_source_files_properties(bindings.cc PROPERTIES LANGUAGE CUDA)
29-
set_source_files_properties(bindings.cc PROPERTIES COMPILE_FLAGS "${CUDA_NVCC_FLAGS}")
51+
set_source_files_properties(bindings_cuda.cc PROPERTIES LANGUAGE CUDA)
52+
set_source_files_properties(bindings_cuda.cc PROPERTIES COMPILE_FLAGS "${CUDA_NVCC_FLAGS}")
3053

3154
if(DEFINED SIMD_SOURCE_FILE)
3255
set_source_files_properties(${SIMD_SOURCE_FILE} PROPERTIES LANGUAGE CUDA)
@@ -36,34 +59,29 @@ if(AER_THRUST_BACKEND STREQUAL "CUDA")
3659

3760
string(STRIP ${AER_COMPILER_FLAGS} AER_COMPILER_FLAGS_STRIPPED)
3861
nvcc_add_compiler_options(${AER_COMPILER_FLAGS_STRIPPED} AER_COMPILER_FLAGS_OUT)
39-
set_target_properties(controller_wrappers PROPERTIES COMPILE_FLAGS "${AER_COMPILER_FLAGS_OUT}")
62+
set_target_properties(controller_wrappers_cuda PROPERTIES COMPILE_FLAGS "${AER_COMPILER_FLAGS_OUT}")
4063
enable_language(CUDA)
64+
configure_target(controller_wrappers_cuda)
65+
# Build the ROCm backend
4166
elseif(AER_THRUST_BACKEND STREQUAL "ROCM")
67+
set(BACKEND_MODULE_NAME "controller_wrappers_rocm")
68+
configure_file(bindings.cc.in bindings_rocm.cc)
69+
basic_pybind11_add_module(controller_wrappers_rocm bindings_rocm.cc "${SIMD_SOURCE_FILE}")
4270

4371
if(NOT DEFINED SIMD_SOURCE_FILE)
4472
message(FATAL_ERROR "ROCm supported target machines are expected to be SIMD-enabled.")
4573
endif()
4674

4775
set_source_files_properties(
48-
bindings.cc
76+
bindings_rocm.cc
4977
${SIMD_SOURCE_FILE}
5078
PROPERTIES LANGUAGE CXX)
5179

52-
target_compile_options(controller_wrappers PRIVATE ${ROCM_EXTRA_FLAGS} ${SIMD_FLAGS_LIST})
53-
target_compile_definitions(controller_wrappers PRIVATE ${ROCM_EXTRA_DEFS} ${AER_COMPILER_DEFINITIONS})
54-
set_target_properties(controller_wrappers PROPERTIES COMPILE_FLAGS "${AER_COMPILER_FLAGS}")
55-
else()
56-
if(DEFINED SIMD_SOURCE_FILE)
57-
string(REPLACE ";" " " SIMD_FLAGS "${SIMD_FLAGS_LIST}")
58-
set_source_files_properties(${SIMD_SOURCE_FILE} PROPERTIES COMPILE_FLAGS "${SIMD_FLAGS}")
59-
endif()
60-
set_target_properties(controller_wrappers PROPERTIES COMPILE_FLAGS "${AER_COMPILER_FLAGS}")
80+
target_compile_options(controller_wrappers_rocm PRIVATE ${ROCM_EXTRA_FLAGS} ${SIMD_FLAGS_LIST})
81+
target_compile_definitions(controller_wrappers_rocm PRIVATE ${ROCM_EXTRA_DEFS} ${AER_COMPILER_DEFINITIONS})
82+
set_target_properties(controller_wrappers_rocm PROPERTIES COMPILE_FLAGS "${AER_COMPILER_FLAGS}")
83+
configure_target(controller_wrappers_rocm)
6184
endif()
62-
target_include_directories(controller_wrappers PRIVATE ${AER_SIMULATOR_CPP_SRC_DIR}
63-
PRIVATE ${AER_SIMULATOR_CPP_EXTERNAL_LIBS})
64-
target_link_libraries(controller_wrappers ${AER_LIBRARIES})
65-
target_compile_definitions(controller_wrappers PRIVATE ${AER_COMPILER_DEFINITIONS})
66-
install(TARGETS controller_wrappers LIBRARY DESTINATION qiskit_aer/backends)
6785

6886
# Install redistributable dependencies
6987
install(FILES ${BACKEND_REDIST_DEPS} DESTINATION qiskit_aer/backends)

qiskit_aer/backends/wrappers/bindings.cc renamed to qiskit_aer/backends/wrappers/bindings.cc.in

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ DISABLE_WARNING_POP
1818

1919
using namespace AER;
2020

21-
PYBIND11_MODULE(controller_wrappers, m) {
21+
PYBIND11_MODULE(@BACKEND_MODULE_NAME@, m) {
2222

2323
#ifdef AER_MPI
2424
int prov;

0 commit comments

Comments
 (0)