Skip to content

Commit 92ca2da

Browse files
bors[bot]taiki-e
andauthored
Merge #636
636: CachePadded: update alignment based on golang's CacheLinePadSize r=jeehoonkang a=taiki-e This updates alignment of `CachePadded` on the following architectures based on golang's [`CacheLinePadSize`](https://github.com/golang/go/blob/3510a1e32cbc86b73db143aefcc00aadc44c27bd/src/internal/cpu/cpu.go#L20). - On [powerpc64](https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_ppc64x.go#L9), use 128-byte alignment. - On [arm](https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_arm.go#L7), [mips](https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips.go#L7), [mips64](https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips64x.go#L9), and [riscv64](https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_riscv64.go#L7), use 32-byte alignment. - On [s390x](https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_s390x.go#L7), use 256-byte alignment. On x86_64 and aarch64, use 128-byte alignment as before. See #331 and #499 for reasons. On all others, use 64-byte alignment as before. Closes #427 cc @stjepang (when this merged, I'll send a same patch to smol-rs/cache-padded) FYI @yoshuawuyts @cuviper (because you all were [discussing about adding `CachePadded` to the standard library](https://rust-lang.zulipchat.com/#narrow/stream/219381-t-libs/topic/.60std.3A.3Amem.3A.3ACachePadded.60)) Co-authored-by: Taiki Endo <[email protected]>
2 parents 06229f5 + 1e16fc0 commit 92ca2da

File tree

1 file changed

+56
-4
lines changed

1 file changed

+56
-4
lines changed

crossbeam-utils/src/cache_padded.rs

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ use core::ops::{Deref, DerefMut};
1313
///
1414
/// Cache lines are assumed to be N bytes long, depending on the architecture:
1515
///
16-
/// * On x86-64 and aarch64, N = 128.
16+
/// * On x86-64, aarch64, and powerpc64, N = 128.
17+
/// * On arm, mips, mips64, and riscv64, N = 32.
18+
/// * On s390x, N = 256.
1719
/// * On all others, N = 64.
1820
///
1921
/// Note that N is just a reasonable guess and is not guaranteed to match the actual cache line
@@ -64,13 +66,63 @@ use core::ops::{Deref, DerefMut};
6466
// - https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf
6567
// - https://github.com/facebook/folly/blob/1b5288e6eea6df074758f877c849b6e73bbb9fbb/folly/lang/Align.h#L107
6668
//
67-
// ARM's big.LITTLE architecture has asymmetric cores and "big" cores have 128 byte cache line size
69+
// ARM's big.LITTLE architecture has asymmetric cores and "big" cores have 128-byte cache line size.
70+
//
6871
// Sources:
6972
// - https://www.mono-project.com/news/2016/09/12/arm64-icache/
7073
//
71-
#[cfg_attr(any(target_arch = "x86_64", target_arch = "aarch64"), repr(align(128)))]
74+
// powerpc64 has 128-byte cache line size.
75+
//
76+
// Sources:
77+
// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_ppc64x.go#L9
78+
#[cfg_attr(
79+
any(
80+
target_arch = "x86_64",
81+
target_arch = "aarch64",
82+
target_arch = "powerpc64",
83+
),
84+
repr(align(128))
85+
)]
86+
// arm, mips, mips64, and riscv64 have 32-byte cache line size.
87+
//
88+
// Sources:
89+
// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_arm.go#L7
90+
// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips.go#L7
91+
// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mipsle.go#L7
92+
// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips64x.go#L9
93+
// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_riscv64.go#L7
94+
#[cfg_attr(
95+
any(
96+
target_arch = "arm",
97+
target_arch = "mips",
98+
target_arch = "mips64",
99+
target_arch = "riscv64",
100+
),
101+
repr(align(32))
102+
)]
103+
// s390x has 256-byte cache line size.
104+
//
105+
// Sources:
106+
// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_s390x.go#L7
107+
#[cfg_attr(target_arch = "s390x", repr(align(256)))]
108+
// x86 and wasm have 64-byte cache line size.
109+
//
110+
// Sources:
111+
// - https://github.com/golang/go/blob/dda2991c2ea0c5914714469c4defc2562a907230/src/internal/cpu/cpu_x86.go#L9
112+
// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_wasm.go#L7
113+
//
114+
// All others are assumed to have 64-byte cache line size.
72115
#[cfg_attr(
73-
not(any(target_arch = "x86_64", target_arch = "aarch64")),
116+
not(any(
117+
target_arch = "x86_64",
118+
target_arch = "aarch64",
119+
target_arch = "powerpc64",
120+
target_arch = "arm",
121+
target_arch = "mips",
122+
target_arch = "mips64",
123+
target_arch = "riscv64",
124+
target_arch = "s390x",
125+
)),
74126
repr(align(64))
75127
)]
76128
pub struct CachePadded<T> {

0 commit comments

Comments
 (0)