c - 手动填充数组

标签 c performance openmp xeon-phi

我试图从 this book 理解 9 点模板的算法,逻辑对我来说很清楚,但是WIDTHP宏的计算是我无法理解的,这里是简要代码(原始代码超过300行长度!!):

#define PAD64 0
#define WIDTH 5900
#if PAD64
#define WIDTHP ((((WIDTH*sizeof(REAL))+63)/64)*(64/sizeof(REAL)))
#else
#define WIDTHP WIDTH
#endif
#define HEIGHT 10000

REAL *fa = (REAL *)malloc(sizeof(REAL)*WIDTHP*HEIGHT);
REAL *fb = (REAL *)malloc(sizeof(REAL)*WIDTHP*HEIGHT);

原始数组是 5900 X 10000,但是如果我定义 PAD64 ,则数组 变为 5915.75 X 10000

虽然到目前为止我可以猜测作者正在尝试将数组对齐并填充到 64 字节边界。但是 malloc 返回的数组通常是对齐的(&填充的),而且 posix_memalign gives you a chunk of memory that is guaranteed to have the requested alignment ,我们还可以使用

__attribute__((align(64)))

此 WITHP 会对我的代码性能产生什么影响?

最佳答案

这个想法是,通过在行的末尾添加填充,可以将矩阵的每一行(或列,如果它被视为列主矩阵)与新缓存行的开头对齐。当然,这到底会产生什么影响很大程度上取决于访问模式,但一般来说,缓存友好性对于密集的数字运算代码来说非常重要。

而且,计算是整数,所以结果肯定不是5915.75,这没有意义。

关于c - 手动填充数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29962854/

相关文章:

mysql - 在 MySQL 中使用 SELECT * 的潜在负面影响是什么?

java - Java同时访问同一个对象的不同成员

c - 读取以 CR 结尾的关键字文本文件

c - char str[1] 和 char *str 在这种情况下的区别?

php - SQL 中的插入查询花费了很多时间

c - 用于距离计算的并行 C 代码

cpu 内核与线程

c - 多维嵌套 OpenMP 循环

使用 pthreads() 创建和管理线程

c - GDB 影响 setcontext 结果