2010-10-22 94 views
2

如果使用64位UNIX操作系统,将数组大小定义为8的倍数是否有优势?我打算使用这个数组来从共享内存中加载数据。因此操作系统和页面大小上可能存在依赖关系。数组大小优化

+0

你的意思是数组大小? – 2010-10-22 13:30:52

+0

是的,我的意思是数组大小 – 2010-10-22 13:31:42

+0

为什么8?大声笑这将是更好的定义数组大小的倍数'PAGE_SIZE/sizeof(ARRAY_ELEMENT)'...'4096/8' =='512'(开玩笑) – pmg 2010-10-22 13:32:56

回答

8

没关系。你的编译器知道它是否需要填充,所以让它决定。不要因为猜测而弄脏代码。

让你的程序工作第一个,然后关心性能与分析器。

+0

我的程序工作正常,我使用这个数组从共享内存中加载数据。所以问题是关于性能和内存使用情况? – 2010-10-22 13:35:18

+3

@Sachin:你确定这是你程序中的瓶颈吗?你在数组中做什么是你想要提出的问题。你能添加更多的上下文吗? – GManNickG 2010-10-22 13:36:40

+0

我已更新问题,请现在检查 – 2010-10-22 13:40:47

2

假设你在堆上动态分配数组,假设malloc的内部分配算法将实际上对内核的内存请求抽象化,这是公平的。也就是说,malloc()调用和libc的brk()(或mmap())系统调用之间可能存在或可能不存在直接关系。

malloc手册页有更多关于此的内容。

因此,就内存使用情况而言,我倾向于建议由于malloc可能会在你下面做一些不同的事情(并且是合理的),所以你是否分配8个字节的倍数并不重要。

就程序性能而言,数据结构在内存中的分配可能会对缓存性能产生巨大影响。但是,最终,您需要对应用程序进行配置,以查看是否可以提高其缓存性能。我不相信有一条强硬的规则可以让你在编写代码的时候优化它。

如果你有兴趣了解更多关于记忆和Linux,乌利齐·德雷珀关于这个问题在几年前写了一个梦幻般的系列LWN:

http://lwn.net/Articles/250967

2

如果你是有关内存访问对齐或所以 - 这是内部环境/ libc事宜如何调整动态分配。如果其大小对齐,则不保证以特定方式对齐某个数组。许多分配器返回对齐到某个值的内存块(大约是机器字的2倍或4倍大小),所以它不是调整对齐的地方。

我只记得几件事情,可能有重要意义:

  1. 您可能希望使用矢量操作和/或展开的循环处理数组,所以它可能需要有一定的留白,使程序不超出分配区域。 (但是,如果你的向量引擎需要超出标准C实现提供的对齐方式,你必须以另一种方式分配内存,而不仅仅是简单的malloc())。

  2. 大多数内存分配器在分配区域旁边存储服务信息(例如分配的块大小),并且从空闲中切割的总内存大小稍大。最好是分配比某个值小一些的区域,以便在某个标准分配块(比如内存页面)中有密集的区域。例如,如果CPU有4k页,那么页面可能只包含3个1024字节块,但是4个1008字节(= 1024-8)块。另外,许多内存分配器都有一个块大小阈值,低于这样的内存是从堆中分配的,但是在它之上,内存是通过整个硬件页直接从OS VM调度器获得的,因此在页边界上对齐。在这种情况下,可能需要将分配大小舍入到页面大小以获得整个页面。

有可能是soume其他问题,但我不记得他们。

+0

很好的答案。两个问题。 L2高速缓存中的块与RAM块的大小相同吗? L2缓存是否缓存单个块还是具有更精细的粒度? “ ”作为一个例子,如果CPU有4k页面,那么页面可能只包含3个1024字节块,但是4个1008字节(= 1024-8)块。“这如何确定? – HaltingState 2011-12-25 14:26:48

+0

具体值取决于MPU开发人员,可能因模型而异,因此a不能全部回答您。您必须查看MPU数据表以获得答案。无论如何,作为一种良好的做法,您不应该依赖特定的值或分配器行为(至少在您的代码检查为真)之前。缓存页面可能因型号不同而不同,作为VMM页面的'硬件页面'甚至可以通过OS切换,因此根据上下文有很多答案。 – Vovanium 2011-12-26 19:35:29