Trong hàng đợi mpmc giới hạn tuyệt vời của Dmitry Vyukov được viết bằng C++ Xem: http://www.1024cores.net/home/lock-free-algorithms/queues/bounded-mpmc-queueLàm cách nào và khi nào để căn chỉnh kích thước đường bộ nhớ cache?
Ông ấy thêm một số biến số đệm. Tôi đoán điều này là để làm cho nó phù hợp với một dòng bộ nhớ cache cho hiệu suất.
Tôi có một số câu hỏi.
- Tại sao nó được thực hiện theo cách này?
- Đây có phải là phương pháp di động sẽ luôn hoạt động
- Thay vào đó, tốt nhất nên sử dụng
__attribute__ ((aligned (64)))
. tại sao phải đệm trước khi con trỏ đệm trợ giúp hiệu suất? không chỉ là con trỏ được nạp vào bộ đệm nên nó thực sự chỉ là kích thước của một con trỏ?
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_;
Sẽ khái niệm này làm việc dưới gcc cho mã c?
@Novelcrat - Ok điều đó có ý nghĩa rất nhiều. Vậy còn câu hỏi 2 và 3 thì sao? – Matt
@MattH: Đối với tính di động C++ 11 giới thiệu 'std :: aligned_storage' cho phép bạn yêu cầu lưu trữ kích thước và căn chỉnh được xác định.Căn chỉnh mặc định cho 'char [N]' là '1' nếu không. –
Tại sao trình liên kết không tối ưu hóa các biến padding nếu chúng không được sử dụng? – RishiD