使用带有对齐内存的movapd崩溃

问题描述 投票:0回答:1

我在Windows上使用64位NASM在malloc上分配了一块内存。当我使用movapd(移动两个对齐的打包双精度浮点值)时,我的程序崩溃,但我可以使用movupd(移动两个未对齐的打包双精度浮点值)。

我改为_aligned_malloc指定alignment = 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

奇怪的是,使用_aligned_malloc的程序比使用malloc'd内存要慢。

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

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

windows assembly x86-64 simd memory-alignment
1个回答
0
投票

在这个特殊情况下,这是这个问题的答案。在多核处理之后,我有四个小缓冲区组合成一个大缓冲区。我正在使用SIMD加速这个过程。

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

7024645 0 714474.5 19906565 0 THREAD 1

10285061 0 728618 19906565 714474.5线程2

13414405 0 726064.5 19906565 1443092.5螺纹3

16781317 0 724936 19906565 2169157 THREAD 4

第三列和第五列显示的值不均匀地除以16,因此我无法使用对齐访问。第三列是该线程的小缓冲区的大小。 “未对准”的原因是因为程序为每个段返回不等数量的四字,这意味着最终输出可能会或可能不会以16的偶数倍结束 - 作为一个简单的例子,如果我有三个四字( 24字节),不均匀地除以16。

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

我对此有任何意见感兴趣。谢谢您的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.