Skip to content

Commit f91e901

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

File tree

3 files changed

+66
-21
lines changed

3 files changed

+66
-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

+39-20
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,37 @@ 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 ${CMAKE_CURRENT_SOURCE_DIR}
25+
PRIVATE ${AER_SIMULATOR_CPP_SRC_DIR}
26+
PRIVATE ${AER_SIMULATOR_CPP_EXTERNAL_LIBS})
27+
target_link_libraries(${target_name} ${AER_LIBRARIES})
28+
target_compile_definitions(${target_name} PRIVATE ${AER_COMPILER_DEFINITIONS})
29+
install(TARGETS ${target_name} LIBRARY DESTINATION qiskit_aer/backends)
30+
endmacro()
2531

32+
# Build the CPU backend
33+
set(BACKEND_MODULE_NAME "controller_wrappers_cpu")
34+
configure_file(bindings.cc.in bindings_cpu.cc)
35+
basic_pybind11_add_module(controller_wrappers_cpu bindings_cpu.cc "${SIMD_SOURCE_FILE}")
36+
37+
if(DEFINED SIMD_SOURCE_FILE)
38+
string(REPLACE ";" " " SIMD_FLAGS "${SIMD_FLAGS_LIST}")
39+
set_source_files_properties(${SIMD_SOURCE_FILE} PROPERTIES COMPILE_FLAGS "${SIMD_FLAGS}")
40+
endif()
41+
42+
set_target_properties(controller_wrappers_cpu PROPERTIES COMPILE_FLAGS "${AER_COMPILER_FLAGS}")
43+
configure_target(controller_wrappers_cpu)
44+
45+
# Build the CUDA backend
2646
if(AER_THRUST_BACKEND STREQUAL "CUDA")
47+
set(BACKEND_MODULE_NAME "controller_wrappers_cuda")
48+
configure_file(bindings.cc.in bindings_cuda.cc)
49+
basic_pybind11_add_module(controller_wrappers_cuda bindings_cuda.cc "${SIMD_SOURCE_FILE}")
50+
2751
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}")
52+
set_source_files_properties(bindings_cuda.cc PROPERTIES LANGUAGE CUDA)
53+
set_source_files_properties(bindings_cuda.cc PROPERTIES COMPILE_FLAGS "${CUDA_NVCC_FLAGS}")
3054

3155
if(DEFINED SIMD_SOURCE_FILE)
3256
set_source_files_properties(${SIMD_SOURCE_FILE} PROPERTIES LANGUAGE CUDA)
@@ -36,34 +60,29 @@ if(AER_THRUST_BACKEND STREQUAL "CUDA")
3660

3761
string(STRIP ${AER_COMPILER_FLAGS} AER_COMPILER_FLAGS_STRIPPED)
3862
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}")
63+
set_target_properties(controller_wrappers_cuda PROPERTIES COMPILE_FLAGS "${AER_COMPILER_FLAGS_OUT}")
4064
enable_language(CUDA)
65+
configure_target(controller_wrappers_cuda)
66+
# Build the ROCm backend
4167
elseif(AER_THRUST_BACKEND STREQUAL "ROCM")
68+
set(BACKEND_MODULE_NAME "controller_wrappers_rocm")
69+
configure_file(bindings.cc.in bindings_rocm.cc)
70+
basic_pybind11_add_module(controller_wrappers_rocm bindings_rocm.cc "${SIMD_SOURCE_FILE}")
4271

4372
if(NOT DEFINED SIMD_SOURCE_FILE)
4473
message(FATAL_ERROR "ROCm supported target machines are expected to be SIMD-enabled.")
4574
endif()
4675

4776
set_source_files_properties(
48-
bindings.cc
77+
bindings_rocm.cc
4978
${SIMD_SOURCE_FILE}
5079
PROPERTIES LANGUAGE CXX)
5180

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}")
81+
target_compile_options(controller_wrappers_rocm PRIVATE ${ROCM_EXTRA_FLAGS} ${SIMD_FLAGS_LIST})
82+
target_compile_definitions(controller_wrappers_rocm PRIVATE ${ROCM_EXTRA_DEFS} ${AER_COMPILER_DEFINITIONS})
83+
set_target_properties(controller_wrappers_rocm PROPERTIES COMPILE_FLAGS "${AER_COMPILER_FLAGS}")
84+
configure_target(controller_wrappers_rocm)
6185
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)
6786

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

qiskit_aer/backends/wrappers/bindings.cc 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)