diff --git a/apps/qsim_amplitudes.cc b/apps/qsim_amplitudes.cc index 01d50b96d..d37fdd6b9 100644 --- a/apps/qsim_amplitudes.cc +++ b/apps/qsim_amplitudes.cc @@ -30,6 +30,7 @@ #include "../lib/run_qsim.h" #include "../lib/simmux.h" #include "../lib/util.h" +#include "../lib/util_cpu.h" constexpr char usage[] = "usage:\n ./qsim_amplitudes -c circuit_file " "-d times_to_save_results -i input_files " diff --git a/apps/qsim_base.cc b/apps/qsim_base.cc index 8d365e9ad..5a7604d5b 100644 --- a/apps/qsim_base.cc +++ b/apps/qsim_base.cc @@ -26,7 +26,7 @@ #include "../lib/io_file.h" #include "../lib/run_qsim.h" #include "../lib/simmux.h" -#include "../lib/util.h" +#include "../lib/util_cpu.h" constexpr char usage[] = "usage:\n ./qsim_base -c circuit -d maxtime " "-s seed -t threads -f max_fused_size " diff --git a/apps/qsim_von_neumann.cc b/apps/qsim_von_neumann.cc index c22649096..465760830 100644 --- a/apps/qsim_von_neumann.cc +++ b/apps/qsim_von_neumann.cc @@ -28,7 +28,7 @@ #include "../lib/io_file.h" #include "../lib/run_qsim.h" #include "../lib/simmux.h" -#include "../lib/util.h" +#include "../lib/util_cpu.h" constexpr char usage[] = "usage:\n ./qsim_von_neumann -c circuit -d maxtime " "-s seed -t threads -f max_fused_size " diff --git a/apps/qsimh_amplitudes.cc b/apps/qsimh_amplitudes.cc index cfb5b09a5..7cb1b085e 100644 --- a/apps/qsimh_amplitudes.cc +++ b/apps/qsimh_amplitudes.cc @@ -30,6 +30,7 @@ #include "../lib/run_qsimh.h" #include "../lib/simmux.h" #include "../lib/util.h" +#include "../lib/util_cpu.h" constexpr char usage[] = "usage:\n ./qsimh_amplitudes -c circuit_file " "-d maxtime -k part1_qubits " diff --git a/apps/qsimh_base.cc b/apps/qsimh_base.cc index c1656a8b8..eb0c9c6ca 100644 --- a/apps/qsimh_base.cc +++ b/apps/qsimh_base.cc @@ -30,6 +30,7 @@ #include "../lib/run_qsimh.h" #include "../lib/simmux.h" #include "../lib/util.h" +#include "../lib/util_cpu.h" constexpr char usage[] = "usage:\n ./qsimh_base -c circuit_file " "-d maximum_time -k part1_qubits " diff --git a/lib/BUILD b/lib/BUILD index d69ae1dad..cc56dbd2b 100644 --- a/lib/BUILD +++ b/lib/BUILD @@ -61,6 +61,7 @@ cc_library( "unitary_calculator_basic.h", "unitary_calculator_sse.h", "util.h", + "util_cpu.h", "vectorspace.h", ], ) @@ -123,6 +124,7 @@ cc_library( "unitary_calculator_basic.h", "unitary_calculator_sse.h", "util.h", + "util_cpu.h", "util_cuda.h", "vectorspace.h", "vectorspace_cuda.h", @@ -170,6 +172,7 @@ cc_library( "unitary_calculator_basic.h", "unitary_calculator_sse.h", "util.h", + "util_cpu.h", "vectorspace.h", ], ) @@ -208,6 +211,7 @@ cc_library( "statespace_basic.h", "statespace_sse.h", "util.h", + "util_cpu.h", "vectorspace.h", ], ) @@ -238,6 +242,11 @@ cc_library( hdrs = ["util.h"], ) +cc_library( + name = "util_cpu", + hdrs = ["util_cpu.h"], +) + # cuda_library cc_library( name = "util_cuda", diff --git a/lib/util.h b/lib/util.h index 933730c32..726a01926 100644 --- a/lib/util.h +++ b/lib/util.h @@ -15,10 +15,6 @@ #ifndef UTIL_H_ #define UTIL_H_ -#ifdef __SSE__ -# include -#endif - #include #include #include @@ -88,23 +84,6 @@ inline std::vector GenerateRandomValues( return rs; } -// This function sets flush-to-zero and denormals-are-zeros MXCSR control -// flags. This prevents rare cases of performance slowdown potentially at -// the cost of a tiny precision loss. -inline void SetFlushToZeroAndDenormalsAreZeros() { -#ifdef __SSE2__ - _mm_setcsr(_mm_getcsr() | 0x8040); -#endif -} - -// This function clears flush-to-zero and denormals-are-zeros MXCSR control -// flags. -inline void ClearFlushToZeroAndDenormalsAreZeros() { -#ifdef __SSE2__ - _mm_setcsr(_mm_getcsr() & ~unsigned{0x8040}); -#endif -} - } // namespace qsim #endif // UTIL_H_ diff --git a/lib/util_cpu.h b/lib/util_cpu.h new file mode 100644 index 000000000..8e0242524 --- /dev/null +++ b/lib/util_cpu.h @@ -0,0 +1,43 @@ +// Copyright 2019 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef UTIL_CPU_H_ +#define UTIL_CPU_H_ + +#ifdef __SSE2__ +# include +#endif + +namespace qsim { + +// This function sets flush-to-zero and denormals-are-zeros MXCSR control +// flags. This prevents rare cases of performance slowdown potentially at +// the cost of a tiny precision loss. +inline void SetFlushToZeroAndDenormalsAreZeros() { +#ifdef __SSE2__ + _mm_setcsr(_mm_getcsr() | 0x8040); +#endif +} + +// This function clears flush-to-zero and denormals-are-zeros MXCSR control +// flags. +inline void ClearFlushToZeroAndDenormalsAreZeros() { +#ifdef __SSE2__ + _mm_setcsr(_mm_getcsr() & ~unsigned{0x8040}); +#endif +} + +} // namespace qsim + +#endif // UTIL_CPU_H_ diff --git a/pybind_interface/avx2/pybind_main_avx2.cpp b/pybind_interface/avx2/pybind_main_avx2.cpp index 5729d163a..1f7dc0842 100644 --- a/pybind_interface/avx2/pybind_main_avx2.cpp +++ b/pybind_interface/avx2/pybind_main_avx2.cpp @@ -16,6 +16,7 @@ #include "../../lib/formux.h" #include "../../lib/simulator_avx.h" +#include "../../lib/util_cpu.h" namespace qsim { template diff --git a/pybind_interface/avx512/pybind_main_avx512.cpp b/pybind_interface/avx512/pybind_main_avx512.cpp index 0073a1e09..b87ececb6 100644 --- a/pybind_interface/avx512/pybind_main_avx512.cpp +++ b/pybind_interface/avx512/pybind_main_avx512.cpp @@ -16,6 +16,7 @@ #include "../../lib/formux.h" #include "../../lib/simulator_avx512.h" +#include "../../lib/util_cpu.h" namespace qsim { template diff --git a/pybind_interface/basic/pybind_main_basic.cpp b/pybind_interface/basic/pybind_main_basic.cpp index 55cb5484b..51fdc6081 100644 --- a/pybind_interface/basic/pybind_main_basic.cpp +++ b/pybind_interface/basic/pybind_main_basic.cpp @@ -16,6 +16,7 @@ #include "../../lib/formux.h" #include "../../lib/simulator_basic.h" +#include "../../lib/util_cpu.h" namespace qsim { template diff --git a/pybind_interface/cuda/pybind_main_cuda.cpp b/pybind_interface/cuda/pybind_main_cuda.cpp index 391cb976e..88fa3a61d 100644 --- a/pybind_interface/cuda/pybind_main_cuda.cpp +++ b/pybind_interface/cuda/pybind_main_cuda.cpp @@ -41,6 +41,9 @@ namespace qsim { StateSpace::Parameter ss_params; Simulator::Parameter sim_params; }; + + inline void SetFlushToZeroAndDenormalsAreZeros() {} + inline void ClearFlushToZeroAndDenormalsAreZeros() {} } #include "../pybind_main.cpp" diff --git a/pybind_interface/custatevec/pybind_main_custatevec.cpp b/pybind_interface/custatevec/pybind_main_custatevec.cpp index 109cedae6..1e3996335 100644 --- a/pybind_interface/custatevec/pybind_main_custatevec.cpp +++ b/pybind_interface/custatevec/pybind_main_custatevec.cpp @@ -53,6 +53,9 @@ struct Factory { custatevecHandle_t custatevec_handle; }; +inline void SetFlushToZeroAndDenormalsAreZeros() {} +inline void ClearFlushToZeroAndDenormalsAreZeros() {} + } #include "../pybind_main.cpp" diff --git a/pybind_interface/pybind_main.cpp b/pybind_interface/pybind_main.cpp index 428372d11..d02c0693d 100644 --- a/pybind_interface/pybind_main.cpp +++ b/pybind_interface/pybind_main.cpp @@ -30,7 +30,6 @@ #include "../lib/qtrajectory.h" #include "../lib/run_qsim.h" #include "../lib/run_qsimh.h" -#include "../lib/util.h" using namespace qsim; diff --git a/pybind_interface/sse/pybind_main_sse.cpp b/pybind_interface/sse/pybind_main_sse.cpp index 4c72a65a0..674aecad4 100644 --- a/pybind_interface/sse/pybind_main_sse.cpp +++ b/pybind_interface/sse/pybind_main_sse.cpp @@ -16,6 +16,7 @@ #include "../../lib/formux.h" #include "../../lib/simulator_sse.h" +#include "../../lib/util_cpu.h" namespace qsim { template diff --git a/tests/BUILD b/tests/BUILD index 47f90535b..af59659ec 100644 --- a/tests/BUILD +++ b/tests/BUILD @@ -265,7 +265,7 @@ cc_library( "//lib:gate_appl", "//lib:gates_qsim", "//lib:io", - "//lib:util", + "//lib:util_cpu", ], testonly = 1, ) diff --git a/tests/simulator_testfixture.h b/tests/simulator_testfixture.h index 05cad5a66..ef335565c 100644 --- a/tests/simulator_testfixture.h +++ b/tests/simulator_testfixture.h @@ -27,7 +27,7 @@ #include "../lib/gate_appl.h" #include "../lib/gates_qsim.h" #include "../lib/io.h" -#include "../lib/util.h" +#include "../lib/util_cpu.h" namespace qsim {