Skip to content

Commit 0cb6adc

Browse files
authored
Increase OS and future C++ version compatibility (#487)
- Port over some changes needed for eventual C++20 compatibility - Enable compiler optimizations on Windows
1 parent 94dce47 commit 0cb6adc

15 files changed

Lines changed: 84 additions & 45 deletions

BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ cc_binary(
9393
"-fvisibility=hidden",
9494
"-march=native",
9595
"-DSTIM_PYBIND11_MODULE_NAME=stim",
96-
"-DVERSION_INFO=0.0.dev"
96+
"-DVERSION_INFO=0.0.dev",
9797
],
9898
includes = ["src/"],
9999
linkopts = ["-lpthread"],

setup.py

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14+
import sys
1415

1516
from setuptools import setup, Extension
1617
import glob
@@ -26,22 +27,35 @@
2627

2728
version = '1.11.dev0'
2829

29-
common_compile_args = [
30-
'-std=c++11',
31-
'-fno-strict-aliasing',
32-
'-O3',
33-
'-g0',
34-
f'-DVERSION_INFO={version}',
35-
]
30+
if sys.platform.startswith('win'):
31+
common_compile_args = [
32+
'/std:c++11',
33+
'/O2',
34+
f'/DVERSION_INFO={version}',
35+
]
36+
arch_avx = ['/arch:AVX2']
37+
arch_sse = ['/arch:SSE2']
38+
arch_basic = []
39+
else:
40+
common_compile_args = [
41+
'-std=c++11',
42+
'-fno-strict-aliasing',
43+
'-O3',
44+
'-g0',
45+
f'-DVERSION_INFO={version}',
46+
]
47+
arch_avx = ['-mavx2']
48+
arch_sse = ['-msse2', '-mno-avx2']
49+
arch_basic = []
50+
3651
stim_detect_machine_architecture = Extension(
3752
'stim._detect_machine_architecture',
3853
sources=MUX_SOURCE_FILES,
3954
include_dirs=[pybind11.get_include(), "src"],
4055
language='c++',
4156
extra_compile_args=[
4257
*common_compile_args,
43-
'-mno-sse2',
44-
'-mno-avx2',
58+
*arch_basic,
4559
],
4660
)
4761
stim_polyfill = Extension(
@@ -51,8 +65,7 @@
5165
language='c++',
5266
extra_compile_args=[
5367
*common_compile_args,
54-
# I would specify -mno-sse2 but that causes build failures in non-stim code...?
55-
'-mno-avx2',
68+
*arch_basic,
5669
'-DSTIM_PYBIND11_MODULE_NAME=_stim_polyfill',
5770
],
5871
)
@@ -63,8 +76,7 @@
6376
language='c++',
6477
extra_compile_args=[
6578
*common_compile_args,
66-
'-msse2',
67-
'-mno-avx2',
79+
*arch_sse,
6880
'-DSTIM_PYBIND11_MODULE_NAME=_stim_sse2',
6981
],
7082
)
@@ -77,8 +89,7 @@
7789
# language='c++',
7890
# extra_compile_args=[
7991
# *common_compile_args,
80-
# '-msse2',
81-
# '-mavx2',
92+
# *arch_avx,
8293
# '-DSTIM_PYBIND11_MODULE_NAME=_stim_avx2',
8394
# ],
8495
# )

src/stim/benchmark_main.perf.cc

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,40 +25,40 @@ std::vector<RegisteredBenchmark> all_registered_benchmarks{};
2525

2626
/// Describe quantity as an SI-prefixed value with two significant figures.
2727
std::string si2(double val) {
28-
std::string unit = "";
28+
char unit = ' ';
2929
if (val < 1) {
3030
if (val < 1) {
3131
val *= 1000;
32-
unit = "m";
32+
unit = 'm';
3333
}
3434
if (val < 1) {
3535
val *= 1000;
36-
unit = "u";
36+
unit = 'u';
3737
}
3838
if (val < 1) {
3939
val *= 1000;
40-
unit = "n";
40+
unit = 'n';
4141
}
4242
if (val < 1) {
4343
val *= 1000;
44-
unit = "p";
44+
unit = 'p';
4545
}
4646
} else {
4747
if (val > 1000) {
4848
val /= 1000;
49-
unit = "k";
49+
unit = 'k';
5050
}
5151
if (val > 1000) {
5252
val /= 1000;
53-
unit = "M";
53+
unit = 'M';
5454
}
5555
if (val > 1000) {
5656
val /= 1000;
57-
unit = "G";
57+
unit = 'G';
5858
}
5959
if (val > 1000) {
6060
val /= 1000;
61-
unit = "T";
61+
unit = 'T';
6262
}
6363
}
6464
std::stringstream ss;

src/stim/diagram/timeline/timeline_ascii_drawer.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,9 +482,11 @@ AsciiDiagram DiagramTimelineAsciiDrawer::make_diagram(const Circuit &circuit) {
482482
{0, obj.q2y(q), 1.0, 0.5},
483483
{obj.m2x(obj.cur_moment), obj.q2y(q), 0.0, 0.5},
484484
};
485+
std::stringstream qubit;
486+
qubit << 'q' << q << ": ";
485487
obj.diagram.add_entry(AsciiDiagramEntry{
486488
{0, obj.q2y(q), 1.0, 0.5},
487-
"q" + std::to_string(q) + ": ",
489+
qubit.str(),
488490
});
489491
}
490492

src/stim/gen/circuit_gen_params.cc

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,19 +57,25 @@ void CircuitGenParameters::append_unitary_2(
5757
}
5858

5959
void CircuitGenParameters::append_reset(Circuit &circuit, const std::vector<uint32_t> targets, char basis) const {
60-
circuit.safe_append_u(std::string("R") + basis, targets);
60+
std::string gate("R");
61+
gate.push_back(basis);
62+
circuit.safe_append_u(gate, targets);
6163
append_anti_basis_error(circuit, targets, after_reset_flip_probability, basis);
6264
}
6365

6466
void CircuitGenParameters::append_measure(Circuit &circuit, const std::vector<uint32_t> targets, char basis) const {
67+
std::string gate("M");
68+
gate.push_back(basis);
6569
append_anti_basis_error(circuit, targets, before_measure_flip_probability, basis);
66-
circuit.safe_append_u(std::string("M") + basis, targets);
70+
circuit.safe_append_u(gate, targets);
6771
}
6872

6973
void CircuitGenParameters::append_measure_reset(
7074
Circuit &circuit, const std::vector<uint32_t> targets, char basis) const {
75+
std::string gate("MR");
76+
gate.push_back(basis);
7177
append_anti_basis_error(circuit, targets, before_measure_flip_probability, basis);
72-
circuit.safe_append_u(std::string("MR") + basis, targets);
78+
circuit.safe_append_u(gate, targets);
7379
append_anti_basis_error(circuit, targets, after_reset_flip_probability, basis);
7480
}
7581

src/stim/gen/circuit_gen_params.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct CircuitGenParameters {
3030

3131
struct GeneratedCircuit {
3232
Circuit circuit;
33-
std::map<std::pair<uint32_t, uint32_t>, std::pair<std::string, uint32_t>> layout;
33+
std::map<std::pair<uint32_t, uint32_t>, std::pair<char, uint32_t>> layout;
3434
std::string hint_str;
3535
std::string layout_str() const;
3636
};

src/stim/gen/gen_color_code.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,11 @@ GeneratedCircuit stim::generate_color_code_circuit(const CircuitGenParameters &p
191191
auto full_circuit = head + body * (params.rounds - 2) + tail;
192192

193193
// Make 2d layout.
194-
std::map<std::pair<uint32_t, uint32_t>, std::pair<std::string, uint32_t>> layout;
194+
std::map<std::pair<uint32_t, uint32_t>, std::pair<char, uint32_t>> layout;
195195
for (auto q : data_coords) {
196-
layout[{(uint32_t)(q.x * 2), (uint32_t)q.y}] = {q.y == 0 ? "L" : "d", p2q[q]};
196+
layout[{(uint32_t)(q.x * 2), (uint32_t)q.y}] = {q.y == 0 ? 'L' : 'd', p2q[q]};
197197
}
198-
std::array<const char *, 3> rgb{"R", "G", "B"};
198+
std::array<char, 3> rgb{'R', 'G', 'B'};
199199
for (auto q : measure_coords) {
200200
auto x = (uint32_t)(q.x * 2);
201201
auto y = (uint32_t)q.y;

src/stim/gen/gen_rep_code.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,11 @@ GeneratedCircuit stim::generate_rep_code_circuit(const CircuitGenParameters &par
8181
Circuit full_circuit = head + body * (params.rounds - 1) + tail;
8282

8383
// Produce a 2d layout.
84-
std::map<std::pair<uint32_t, uint32_t>, std::pair<std::string, uint32_t>> layout;
84+
std::map<std::pair<uint32_t, uint32_t>, std::pair<char, uint32_t>> layout;
8585
for (uint32_t k = 0; k < n; k++) {
86-
layout[{k, 0}] = {std::string() + "dZ"[k & 1], k};
86+
layout[{k, 0}] = {"dZ"[k & 1], k};
8787
}
88-
layout[{0, 0}].first = "L";
88+
layout[{0, 0}].first = 'L';
8989

9090
return {
9191
full_circuit,

src/stim/gen/gen_surface_code.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,19 +191,19 @@ GeneratedCircuit _finish_surface_code_circuit(
191191
Circuit full_circuit = head + body * (params.rounds - 1) + tail;
192192

193193
// Produce a 2d layout.
194-
std::map<std::pair<uint32_t, uint32_t>, std::pair<std::string, uint32_t>> layout;
194+
std::map<std::pair<uint32_t, uint32_t>, std::pair<char, uint32_t>> layout;
195195
float scale = x_order[0].x == 0.5 ? 2 : 1;
196196
for (auto q : data_coords) {
197-
layout[{(uint32_t)(q.x * scale), (uint32_t)(q.y * scale)}] = {"d", p2q[q]};
197+
layout[{(uint32_t)(q.x * scale), (uint32_t)(q.y * scale)}] = {'d', p2q[q]};
198198
}
199199
for (auto q : x_measure_coords) {
200-
layout[{(uint32_t)(q.x * scale), (uint32_t)(q.y * scale)}] = {"X", p2q[q]};
200+
layout[{(uint32_t)(q.x * scale), (uint32_t)(q.y * scale)}] = {'X', p2q[q]};
201201
}
202202
for (auto q : z_measure_coords) {
203-
layout[{(uint32_t)(q.x * scale), (uint32_t)(q.y * scale)}] = {"Z", p2q[q]};
203+
layout[{(uint32_t)(q.x * scale), (uint32_t)(q.y * scale)}] = {'Z', p2q[q]};
204204
}
205205
for (auto q : chosen_basis_observable) {
206-
layout[{(uint32_t)(q.x * scale), (uint32_t)(q.y * scale)}].first = "L";
206+
layout[{(uint32_t)(q.x * scale), (uint32_t)(q.y * scale)}].first = 'L';
207207
}
208208

209209
return {

src/stim/mem/simd_bits.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,10 @@ struct simd_bits {
7171

7272
// Equality.
7373
bool operator==(const simd_bits_range_ref<W> &other) const;
74+
bool operator==(const simd_bits<W> &other) const;
7475
// Inequality.
7576
bool operator!=(const simd_bits_range_ref<W> &other) const;
77+
bool operator!=(const simd_bits<W> &other) const;
7678
/// Determines whether or not any of the bits in the simd_bits are non-zero.
7779
bool not_zero() const;
7880

0 commit comments

Comments
 (0)