Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 手动填充数组_C_Performance_Openmp_Xeon Phi - Fatal编程技术网

C 手动填充数组

C 手动填充数组,c,performance,openmp,xeon-phi,C,Performance,Openmp,Xeon Phi,我试图从中理解9点模具的算法,逻辑对我来说很清楚,但WIDTHP宏的计算是我无法理解的,这是breif代码(原始代码超过300行长度!!): 原始数组是5900 X 10000,但如果我定义PAD64,则数组 变为5915.75 X 10000 虽然到目前为止,我可以猜测作者正在尝试将&pad数组与64字节边界对齐。但是malloc返回的数组通常是对齐的(&padded),而且,我们也可以使用 __attribute__((align(64))) 这个WIDTHP会对我的代码的性能产生什么影响

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

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

虽然到目前为止,我可以猜测作者正在尝试将&pad数组与64字节边界对齐。但是malloc返回的数组通常是对齐的(&padded),而且,我们也可以使用

__attribute__((align(64)))

这个WIDTHP会对我的代码的性能产生什么影响?

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


此外,计算是整数,因此结果肯定不是
5915.75
,这没有意义。

宽度p的计算是

( Width/64) +1

对于整数精度的数学来说,这是非常全面的。我会给你一个更好的答案,除了在SE mobile应用程序中,在这个和列表之间切换是不可行的

我想把这个作为对unwind答案的评论,因为他是对的。但也许我可以解释得更清楚一些,尽管文字比评论中要多

当我进行计算时,我得到5904个实数,即23616字节,即396个缓存线对应64字节缓存线。是字节数,而不是元素数必须是64的倍数

至于为什么要填充宽度的值,让我们看一个较小的示例。让我们假设我们有一个“缓存线”,其中包含10个字母,我们有一个宽度为8个字母、高度为4的“数组”。现在,由于我们假设的数组位于C中,并且C是行主数组,因此该数组将如下所示:

AAAAA
bbbbbbbbbb
中交
DDDDDDDD

但是,当它排列在缓存线中时会是什么样子,因为这些缓存线有10个字母长:

AAAAAAAABB
bbbbbb中交
CCCCDDDD
DD

不太好。只有数组的第一行对齐。但如果我们将宽度填充两个空格,我们将在缓存中得到:

AAAAA__
bbbbbbbbbb__
中交__
DDDDDDDD__

这就是我们想要的。现在我们可以有一个嵌套循环,如

for i = 1 to height
   for j = 1 to width
要知道,每次我们开始处理j循环时,我们需要的数据都会对齐


哦,是的,他们真的应该做点什么来确保数组的第一个元素对齐。”属性((align(64)))不起作用,因为数组是动态分配的,但它们可以使用posix_memalign而不是malloc。

malloc()
返回与16字节边界对齐的内存,而不是与64字节边界对齐的内存。返回的内存
malloc()
不是“填充的”。我理解填充的概念,但您的解释对我来说仍然不清楚。此计算增加了15(5900+15)&行(5915)既不是2的倍数,也不能被64整除。现代英特尔体系结构检索64字节缓存线。5900附近64的最接近倍数为5952或5888,如果您有其他方法计算和对齐宽度P,那么如果您可以在此处解释,那就太好了!!为什么+1??如果你可以的话,请详细说明,也看看我下面的评论放松的答案!不完全是,实际上是宽度+(63/sizeof REAL)。宽度+接近1或7.7。真实的大小是多少。因为所有的数学都是整数精度的,有一个四舍五入,这个“疯狂”的公式控制着它better@rhubarbdog:没有。惯用语
(x+(y-1))/y
用于计算
ceil(x/y)
当正态分割计算
floor(x/y)
时。
for i = 1 to height
   for j = 1 to width