成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用戶空間消除緩存行偽共享的方法

開發 前端
可以使用宏__cacheline_aligned修飾結構體,確保這個結構體的長度對齊到一級緩存行的長度,并且類型是這個結構體的變量(包括全局變量和局部變量)的地址對齊到一級緩存行的長度。

2個處理器寫到不同的物理地址,但是2個物理地址映射到同一個緩存行,這種情況稱為緩存行偽共享(False Sharing),造成的危害是:因為緩存一致性協議而生成大量通信,導致性能下降。消除緩存行偽共享的方法是把不相關的2個數據放在不同的緩存行。

可以使用GCC編譯器提供的屬性“aligned”修飾結構體的字段、結構體或者變量。可以選擇指定名稱前后帶有“__”(2個下劃線)的屬性名稱,在頭文件中使用它們,不必擔心可能有名稱相同的宏,例如使用屬性名稱“aligned”取代“aligned”。

為了使用方便,自己定義宏__cacheline_aligned如下。目前主流的處理器緩存的行大小是64字節,所以把宏L1_CACHE_LINE_SIZE的默認值設置為64。

#if !defined(L1_CACHE_LINE_SIZE)
#define L1_CACHE_LINE_SIZE  64
#endif

#define __cacheline_aligned __attribute__((__aligned__(L1_CACHE_LINE_SIZE)))

#define __cacheline_aligned attribute((aligned(L1_CACHE_LINE_SIZE))) 可以使用宏__cacheline_aligned修飾結構體的字段,確保這個字段在結構體里面的偏移對齊到一級緩存行的長度,也就是偏移是一級緩存行的長度的整數倍。

可以使用宏__cacheline_aligned修飾結構體,確保這個結構體的長度對齊到一級緩存行的長度,并且類型是這個結構體的變量(包括全局變量和局部變量)的地址對齊到一級緩存行的長度。

可以使用宏__cacheline_aligned修飾變量,確保變量的地址對齊到一級緩存行的長度。

1.動態分配結構體

例如結構體s定義如下,要把字段m1和m2分別放在2個緩存行中,使用宏__cacheline_aligned修飾字段m2可以確保這個字段在結構體里面的偏移對齊到一級緩存行的長度,使用宏__cacheline_aligned修飾結構體可以確保結構體的長度對齊到一級緩存行的長度。要想使得字段m2的地址是一級緩存行的長度的整數倍,必須確保動態分配的結構體的起始地址是一級緩存行的長度的整數倍,并且字段m2在結構體里面的偏移是一級緩存行的長度的整數倍。

struct s {
 int m1;
 int m2 __cacheline_aligned;
} __cacheline_aligned;

可以使用函數posix_memalign()或aligned_alloc()給結構體動態分配內存,這兩個函數的原型如下。

#include <stdlib.h>

int posix_memalign(void **memptr, size_t alignment, size_t size);
void *aligned_alloc(size_t alignment, size_t size);

int posix_memalign(void **memptr, size_t alignment, size_t size); void aligned_alloc(size_t alignment, size_t size); 函數 posix_memalign()分配size字節的內存,把分配的內存的地址存放在memptr中。分配的內存的地址是參數alignment的整數倍,參數alignment必須是2的冪,并且是sizeof(void *)的整數倍。

函數aligned_alloc()是C11標準定義的函數,參數size必須是參數alignment的整數倍。分配的內存的地址是參數alignment的整數倍,參數alignment必須是2的冪,并且是sizeof(void *)的整數倍。函數aligned_alloc()返回分配的內存的地址。

2.靜態分配結構體

如果使用宏__cacheline_aligned修飾結構體,那么這個結構體的長度是一級緩存行的長度的整數倍,并且類型是這個結構體的變量(包括全局變量和局部變量)的地址是一級緩存行的長度的整數倍。下面是一個例子。

#include <stdio.h>

#if !defined(L1_CACHE_LINE_SIZE)
#define L1_CACHE_LINE_SIZE  64
#endif

#define __cacheline_aligned __attribute__((__aligned__(L1_CACHE_LINE_SIZE)))

struct s {
 int m1;
 int m2 __cacheline_aligned;
} __cacheline_aligned;

struct s g;

int main(int argc, char *argv[])
{
    struct s v;

    printf("sizeof(g)=%lu, &g=%p, &g %% L1_CACHE_LINE_SIZE = %lu\n",
        sizeof(g), &g, (((unsigned long)&g) % L1_CACHE_LINE_SIZE));
    
    printf("sizeof(v)=%lu, &v=%p, &v %% L1_CACHE_LINE_SIZE = %lu\n",
        sizeof(v), &v, (((unsigned long)&v) % L1_CACHE_LINE_SIZE));
    return 0;
}

運行程序,從打印的信息可以看到:g和v的長度都是128字節,地址是64的整數倍。

如果使用宏__cacheline_aligned修飾變量,那么變量的地址是一級緩存行的長度的整數倍,變量的長度不一定是一級緩存行的長度的整數倍。下面是一個例子。

#include <stdio.h>

#if !defined(L1_CACHE_LINE_SIZE)
#define L1_CACHE_LINE_SIZE  64
#endif

#define __cacheline_aligned __attribute__((__aligned__(L1_CACHE_LINE_SIZE)))

struct s {
 int m1;
 int m2;
};

struct s g __cacheline_aligned;

int main(int argc, char *argv[])
{
    struct s v __cacheline_aligned;

    printf("sizeof(g)=%lu, &g=%p, &g %% L1_CACHE_LINE_SIZE = %lu\n",
        sizeof(g), &g, (((unsigned long)&g) % L1_CACHE_LINE_SIZE));
    
    printf("sizeof(v)=%lu, &v=%p, &v %% L1_CACHE_LINE_SIZE = %lu\n",
        sizeof(v), &v, (((unsigned long)&v) % L1_CACHE_LINE_SIZE));
    return 0;
}

運行程序,從打印的信息可以看到:g和v的長度都是8字節,地址是64的整數倍。

3.參考文檔

(1) GCC的公共函數屬性aligned,https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-aligned-function-attribute

(2) GCC的公共變量屬性aligned,https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-aligned-variable-attribute

(3) GCC的公共類型屬性aligned,https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-aligned-type-attribute

(4) posix_memalign, https://man7.org/linux/man-pages/man3/posix_memalign.3.html

責任編輯:武曉燕 來源: Linux驛站
相關推薦

2017-07-13 16:40:16

偽共享緩存行存儲

2019-12-17 14:24:11

CPU緩存偽共享

2021-11-18 08:55:49

共享CPU內存

2022-12-12 08:39:09

CPUCache偽共享

2022-01-17 14:24:09

共享字節面試

2022-02-02 21:50:25

底層偽共享CPU

2017-08-23 13:21:31

2019-01-15 14:44:02

CPU Cache L共享存儲器

2013-06-14 10:12:22

共享并行

2022-08-17 06:25:19

偽共享多線程

2021-01-14 09:37:20

內核空間用戶

2009-07-01 09:20:08

linux

2015-04-28 13:34:52

phpqq空間發表文章

2021-03-01 11:53:15

面試偽共享CPU

2011-06-30 14:58:16

偽原創

2021-07-14 10:38:29

MySQL共享表獨立表

2015-08-17 14:53:44

2010-10-27 14:41:45

Oracle查詢用戶表

2018-05-22 14:44:53

2021-01-08 05:59:39

Linux應用程序Linux系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99热首页 | 亚洲精品一区二区三区蜜桃久 | 亚洲一区二区三区四区五区午夜 | 青青草国产在线观看 | 亚洲欧美日韩在线 | 国产一区二区免费 | 91精品麻豆日日躁夜夜躁 | 久久久91 | 国产精品99久久免费观看 | 久久久蜜桃一区二区人 | www精品美女久久久tv | 欧美极品少妇xxxxⅹ免费视频 | 国产成人99久久亚洲综合精品 | 九一在线观看 | 精品一区二区三区视频在线观看 | 做a视频 | 久久com| 超碰超碰 | 91视频在线观看 | 亚洲视频在线一区 | 久久伦理中文字幕 | 97精品超碰一区二区三区 | а天堂中文最新一区二区三区 | 999久久精品 | 国产成人在线视频免费观看 | 久久国内精品 | 爱爱爱av | 国产精品久久久久久久久免费软件 | 中国大陆高清aⅴ毛片 | 午夜在线视频 | 在线看黄免费 | 亚洲欧美视频 | 精品视频在线一区 | 一级毛片,一级毛片 | 草久久久 | 九九视频在线观看视频6 | 午夜小视频在线观看 | 日韩欧美三级电影在线观看 | 91se在线 | 一起操网站| 国产精品一区二区在线免费观看 |