使用MovaPD和对齐内存的MovaPD崩溃



我使用Windows上的64位NASM与malloc分配的内存块。当我使用 movapd (移动两个对齐的包装双重精确的浮点值)时,我的程序崩溃了,但是我可以使用 movupupd - 点值)。

我更改为 _aligned_malloc指定对齐= 16,它可以分配内存,但是当我使用 movapd 时,我仍然会遇到错误。在执行我的调试器的说明之前,请显示 r8 = 0xb0fc78, r15 = 0x12fc0050, rcx = 0x6d40050,和 rdx= 0x10010050。 rcx rdx 是两个内存块的指示。 r8 rcx 是块上的计数器

这有效:

movupd xmm0,[rdx+r8]
movupd [r15+rcx],xmm0

这崩溃了:

movapd xmm0,[rdx+r8]
movapd [r15+rcx],xmm0

奇怪的是,与Malloc'D内存相比,使用_aligned_malloc的程序要慢。

我的代码是用nasm(汇编语言)编写的,但我认为语言并不重要。

即使使用_aligned_malloc分配的内存,我为什么不能使用 MovaPD

这是此特定情况下这个问题的答案。经过多项处理后,我有四个小型缓冲液可以合并为一个大型缓冲液。我正在使用SIMD加快过程。

以下是传递到最后一步(组合)的寄存器值,除以16。

7024645 0 714474.5 19906565 0线程1

10285061 0 728618 19906565 714474.5线程2

13414405 0 726064.5 19906565 1443092.5线程3

16781317 0 724936 19906565 2169157线程4

第三列和第五列显示的值不会平均除以16,因此我无法使用对齐的访问。第三列是该线程的小缓冲区的大小。"未对准"的原因是因为该程序返回每个段的不平等数量的四词数,这意味着最终输出可能会在16个中的偶数上结束,也可能不会结束,如果我有三个四句话(如果我有三个QuadWords(24字节),这不会均匀地除以16。

根据这篇博客文章,内存对齐不会显着影响最新处理器的性能:https://lemire.me/blog/2012/05/05/31/data-alignment-for-for-peed-myth-myth-myth-myth-or-or-or- or--现实/

我对此对任何评论都感兴趣。谢谢您的帮助。

最新更新