簡體   English   中英

C和內存訪問延遲中的連續內存分配

[英]Contiguous Memory Allocation in C and Memory Access Latency

我正在讀這篇論文。 http://www.ece.cmu.edu/~ece447/s13/lib/exe/fetch.php?media=moscibroda.pdf

其中,討論了當前用於具有多個核的大多數體系結構的存儲器訪問方法。 本文提供了當處理並發線程時當前方法的局限性的示例,其中on是連續順序指令中的存儲器和順序指令中的其他不連續存儲器位置。

根據該文章,在順序指令中訪問連續存儲器的線程將首先由存儲器控制器服務。 我當然不懷疑這一點,但作者提供了兩個代碼來說明一個應用程序,其中順序訪問連續的內存,另一個連續的內存不是按順序訪問的。 這是代碼。

連續的內存訪問

// initialize arrays a, b
for (j=0; j<N; j++)
    a[index[j]] = b[index[j]];
for (j=0; j<N; j++)
    index[j] = j; // streaming index
for (j=0; j<N; j++)
        b[index[j]] = scalar * a[index[j]];

非連續內存訪問

// initialize arrays a, b
for (j=0; j<N; j++)
   index[j] = rand(); // random # in [0,N]
 for (j=0; j<N; j++)
    a[index[j]] = b[index[j]];
for (j=0; j<N; j++)
  b[index[j]] = scalar * a[index[j]];

我的問題是,如果您要在C中實現此代碼並將其編譯為x86或ARM,然后在某些操作系統(例如Linux)上運行它,您是否可以保證您分配的原始緩沖區的內存位置在物理上是連續的? 它們不只是虛擬的連續內存(除非使用像kmalloc()這樣的Linux方法)?

*注意:作者指出所提供的代碼是偽代碼,所以也許我對實現的困惑是沒有根據的。

我的問題是,如果您要在C中實現此代碼並將其編譯為x86或ARM,然后在某些操作系統(例如Linux)上運行它,您是否可以保證您分配的原始緩沖區的內存位置在物理上是連續的?

答: 是的

代碼不是偽代碼,它是實際C(僅缺少% N ,模運算符,需要將rand()的返回限制為0-(N-1) )。 連續保證的關鍵是使用數組 C中的數組( 與指向類型的指針相對)。 這保證了虛擬內存中所有元素的順序內存位置(通常是現代內存管理器發布的唯一內存類型)。

在連續內存訪問代碼中,您只是按順序迭代連續元素,其中非連續示例迭代數組中的隨機索引。

您的窘境並非毫無根據,因為有許多實例,其中對象集合不保證相鄰元素在內存中是順序的,但作者在示例中指定使用數組 ,以保證所有元素都是順序的(根據定義)。

通過使用rand()使得非連續示例中的訪問不連續(由於它缺少% N而在語法中沒有,因此是偽的)(例如index[j] = rand() % N;會將賦值限制為0-N ,但不保證所有索引都被覆蓋)從我的閱讀中,示例的意圖是強調連續塊內的直接順序訪問,而非連續示例僅作為對比提供作者說明隨機訪問順序塊中的不同元素的示例。

暫無
暫無

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

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