簡體   English   中英

做atomic_store /加載 <stdatomic.h> 適用於英特爾的未對齊,跨緩存行數據?

[英]Do atomic_store/load from <stdatomic.h> work for unaligned, cross-cache-line data on Intel?

使用atomic_store存儲的數據和使用atomic_load加載的數據是否總是一致?

具體來說:C11程序訪問故意放置在現代Intel CPU上高速緩存行之間邊界的64位數據。 它使用atomic_store和atomic_load(來自<stdatomic.h> )從多個線程(在不同的核心上運行)訪問此數據。

數據是否總是顯得一致,或者加載它(atomic_load)有時會有一些屬於舊值的字節,以及屬於更新值的其他字節?

以下是基本的結構和變量定義以及程序的有趣部分,它們在一個循環中,並行地從多個線程發生:

struct Data {
    uint8_t bytes[CACHELINE__BYTECOUNT - 4];
    atomic_uint_fast64_t u64;
} __attribute__((packed)) __attribute__((aligned ((CACHELINE__BYTECOUNT))));

#define VAL1 (0x1111111111111111)
#define VAL2 (0xFFFFFFFFFFFFFFFF)

static struct Data data = { .u64 = VAL1 };

...

    for (uint32_t j = 0; j < 1000; j++) {
        atomic_store(&data.u64, VAL1);
        atomic_store(&data.u64, VAL2);
    }
    const uint64_t val = atomic_load(&data.u64);
    /* is 'val' always VAL1 or VAL2? */

(完全可運行的程序: https//gist.github.com/sinelaw/1230d4675d6a4fff394110f17e463954

用gcc 6.3.0和clang 3.7檢查它顯示它不是原子的:

$ clang -std=c11 -Wall -Wextra /tmp/atomic.c -o /tmp/atomic -lpthread
$ /tmp/atomic
ERROR: oh no, got: 11111111FFFFFFFF

所以要么程序中有錯誤,要么我誤解了<stdatomic.h> ,或者編譯器中存在錯誤。

正確編寫的程序無法獲取未正確對齊的對象。 正確對齊的int64無法跨越緩存行。

所以你的問題的答案是:你的程序中有一個錯誤。 您通過使用非標准構造( __attribute__ )來故意引入的錯誤。

對於編譯器來說,確保stdatomic適用於未對齊的值是很瘋狂的,因為這需要一個全局鎖,這是stdatomic特別要避免的。

暫無
暫無

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

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