簡體   English   中英

高速緩存行緩存,用於緩存行大小倍數的變量

[英]Cache line padding for variables that are a multiple of cache line size

我正在創建一個非常快速的多線程離散事件仿真框架。 框架的核心使用原子和無鎖編程技術來實現跨多個線程的非常快速的執行。 這需要我將一些變量與高速緩存行對齊並填充剩余的高速緩存行空間,以便我沒有高速緩存行爭用。 我是這樣做的:

// compute cache line padding size
constexpr u64 CLPAD(u64 _objSize) {
  return ((_objSize / CACHELINE_SIZE) * CACHELINE_SIZE) +
      (((_objSize % CACHELINE_SIZE) > 0) * CACHELINE_SIZE) -
      _objSize;
}

alignas(CACHELINE_SIZE) MyObject myObj;
char padding[CLPAD(sizeof(myObj))];

這對我很有用,但是當我將這種方法用於新的對象類型時,我偶然發現了一個問題。 CLPAD()函數返回填充輸入類型到下一個緩存行所需的字符數量。 但是,如果我輸入一個大小恰好是緩存行數的倍數的類型,則CLPAD返回0.如果您嘗試創建零大小的數組,則會收到此警告/錯誤:

ISO C++ forbids zero-size array 'padding'

我知道在這種情況下我可以修改CLPAD()以返回CACHELINE_SIZE,但后來我無緣無故地刻錄了一個空間緩存行。

如果CLPAD返回0,如何使'padding'的聲明消失?

std::aligned_storage<>頁面,我想出了以下內容:

template<class T, bool = false>
struct padded
{
    using type = struct
    {
        alignas(CACHELINE_SIZE)T myObj;
        char padding[CLPAD(sizeof(T))];
    };
};

template<class T>
struct padded<T, true>
{
    using type = struct
    {
        alignas(CACHELINE_SIZE)T myObj;
    };
};

template<class T>
using padded_t = typename padded<T, (sizeof(T) % CACHELINE_SIZE == 0)>::type;

用法:

struct alignas(32) my_type_1 { char c[32]; }; // char c[32] to silence MSVC warning
struct my_type_2 { char c[CACHELINE_SIZE * 2]; }; // ditto

int main()
{
    padded_t<my_type_1> pt0;
    padded_t<my_type_2> pt1;

    sizeof(pt0);    // 128
    alignof(pt0);   // 128

    sizeof(pt1);    // 256
    alignof(pt1);   // 128
}

您可以根據需要提供訪問myObj的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM