W Dmitrija Vyukov wspaniałe ograniczony MPMC kolejce napisany w C++ zobacz: http://www.1024cores.net/home/lock-free-algorithms/queues/bounded-mpmc-queueJak i kiedy wyrównać do rozmiaru linii pamięci podręcznej?
Dodaje kilka zmiennych padding. Zakładam, że jest to wyrównanie do linii pamięci podręcznej dla wydajności.
Mam kilka pytań.
- Dlaczego robi się to w ten sposób?
- Czy jest to przenośna metoda, która będzie zawsze działać zawsze działa
- W jakich przypadkach najlepiej byłoby użyć
__attribute__ ((aligned (64)))
zamiast tego. dlaczego podszewka przed wskaźnikiem buforu pomaga w wydajności? to nie tylko wskaźnik załadowany do pamięci podręcznej, więc tak naprawdę jest to tylko rozmiar wskaźnika?
static size_t const cacheline_size = 64; typedef char cacheline_pad_t [cacheline_size]; cacheline_pad_t pad0_; cell_t* const buffer_; size_t const buffer_mask_; cacheline_pad_t pad1_; std::atomic<size_t> enqueue_pos_; cacheline_pad_t pad2_; std::atomic<size_t> dequeue_pos_; cacheline_pad_t pad3_;
to będzie działać pojęcie pod gcc dla kodu C?
@Novelcrat - OK, to ma wiele sensu. A co z pytaniami 2 i 3? – Matt
@MattH: Dla przenośności C++ 11 wprowadza 'std :: matching_storage', który pozwala wymagać przechowywania określonego rozmiaru i wyrównania.Domyślnym wyrównaniem dla 'char [N]' jest "1" w przeciwnym razie. –
Dlaczego linker nie optymalizuje wyściełanych zmiennych, jeśli nie są używane? – RishiD