【发布时间】:2018-05-30 17:40:39
【问题描述】:
我正在阅读这篇论文。 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 方法)?
*注:作者指定提供的代码是伪代码,所以也许我对实现的困惑是没有根据的。
【问题讨论】:
-
您认为什么是“原始缓冲区”?你的意思是声明的数组
a、b和index? -
您阅读的代码可能比现有的更多。代码不是伪代码,而是实际的 C。连续保证的关键是使用了 arrays。数组(相对于指向类型指针的指针)保证所有元素的顺序内存位置。在连续内存访问代码中,您只是按顺序迭代连续元素,其中非连续示例迭代数组中的随机索引。
-
@DavidC.Rankin。他们是吗?它们在虚拟内存中肯定是连续的,因为我可以使用 C 迭代器操作使用指针来迭代虚拟内存中的位置。这是否也适用于内存中虚拟内存位置的物理值? IE创建数组时,编译器是否在虚拟内存映射中选择物理位置连续的一组位置?
-
@JackFrye 即使页面不连续,每个是的页面上都有
PAGE_SIZE字节,这很重要。 -
@AnttiHaapala 这意味着他的代码只是伪代码,实现将完全依赖于操作系统。他提到他在 Windows XP 上进行了测试。您所描述的是 GNU Linux API。此代码不能用于任何 N。它必须是伪代码。对吗?
标签: c multithreading memory memory-management