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

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

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

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

可以使用GCC編譯器提供的屬性“aligned”修飾結構體的字段、結構體或者變量??梢赃x擇指定名稱前后帶有“__”(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

2013-06-14 10:12:22

共享并行

2019-01-15 14:44:02

CPU Cache L共享存儲器

2022-08-17 06:25:19

偽共享多線程

2021-01-14 09:37:20

內核空間用戶

2015-04-28 13:34:52

phpqq空間發表文章

2009-07-01 09:20:08

linux

2021-03-01 11:53:15

面試偽共享CPU

2011-06-30 14:58:16

偽原創

2021-07-14 10:38:29

MySQL共享表獨立表

2010-10-27 14:41:45

Oracle查詢用戶表

2015-08-17 14:53:44

2021-01-08 05:59:39

Linux應用程序Linux系統

2018-05-22 14:44:53

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩中文视频 | 久久久日韩精品一区二区三区 | 日韩精品一区二区三区中文在线 | 综合九九| 天天综合亚洲 | 色综合网站 | 欧美夜夜| 成人看片在线观看 | 国产精品一区二区精品 | 国产伦精品一区二区三区精品视频 | 国产高清在线精品一区二区三区 | 国产精品成av人在线视午夜片 | 亚洲精品视频一区 | 特级做a爰片毛片免费看108 | 日韩在线免费视频 | 国产成在线观看免费视频 | 久草中文在线 | 成人久久久 | 国产成人av电影 | 日韩中文一区 | 成人免费三级电影 | www.久| 成年人在线| 狠狠色综合欧美激情 | 毛片视频网站 | 久久久久久久一级 | 日本精品一区二区 | 欧美做暖暖视频 | 精品国产一级片 | 久久国产精品色av免费观看 | 国产乱码精品一品二品 | 黄篇网址 | www.久久久久久久久久久 | 美女激情av | 国产精品一区二区免费 | 日韩欧美高清 | 久久久91| 在线一区二区观看 | 亚洲天堂一区二区 | 亚洲精品18 | 国产日韩欧美在线播放 |