Memory 汇编程序中的块复制

Memory 汇编程序中的块复制,memory,assembly,copy,Memory,Assembly,Copy,我的项目-RAM速度测试实用程序。 所以我使用MOVSD(作为块DW最大的MOV)从一个源读取一些内存,然后写入另一个源。但我得到的结果显示,RAM没有被使用,而是被用于内存缓存,因为在DDR2SDRAM中,读/写速度是768Mbyte/s 因此,我需要80x86汇编程序中的指令或函数将大数据块移动到内存中,使缓存溢出并测试内存,而不是缓存测试。我使用汇编程序是因为我不需要C/C++所做的优化,我重写了不同的内存块,编译器可能认为它不需要,并破坏了我的测试。这就是为什么我不使用memcpy和其他

我的项目-RAM速度测试实用程序。 所以我使用MOVSD(作为块DW最大的MOV)从一个源读取一些内存,然后写入另一个源。但我得到的结果显示,RAM没有被使用,而是被用于内存缓存,因为在DDR2SDRAM中,读/写速度是768Mbyte/s


因此,我需要80x86汇编程序中的指令或函数将大数据块移动到内存中,使缓存溢出并测试内存,而不是缓存测试。我使用汇编程序是因为我不需要C/C++所做的优化,我重写了不同的内存块,编译器可能认为它不需要,并破坏了我的测试。这就是为什么我不使用memcpy和其他

移动一个大于最大缓存大小的块,并确保使用
movntdq
进行写入,使用
movntdqa
进行读取。

禁用编译器优化对您的项目来说还不够吗?Cpu缓存/内存不等于ram!!!要使用ram,您需要分配memory@Gunner:胡说八道。缓存对开发人员来说通常是透明的:它可以自动使用。您无法通过
malloc
来避免使用缓存,您需要特殊说明来绕过缓存。禁用优化可能就足够了,也可能不够。这取决于编译器。但我想确定一下。Gunner,我使用WinAPI VirtualAlloc()分配内存。赫希博士,你能告诉我在哪里可以找到这些说明吗?谢谢你,这正是我需要的。但在Microsoft Visual Studio 2010中使用内联汇编程序时存在问题。这里的代码不起作用:void*c=(void*)malloc(16);双精度*指针2=新双精度[4];指针2[0]=0;指针2[1]=2;指针2[3]=0;指针2[4]=4;//\u asm movntdq xmm0,0 \u asm movups xmm0,指针2 \u asm movntdq c,xmm0A 16字节块太小了。不要做像new double[4]这样的事情(要多java?)。在堆栈上分配小数组,在堆上只分配大的内容(比如4k或更多)。代码的问题很可能是对齐。需要16字节对齐。还要记住,处理器总是加载一个完整的缓存线,而不是一个字节(或16个字节)。我上传了几年前写的一些古老的代码,这是一个内存基准,基本上完全满足您的需要。代码大部分是不可移植的(它在我的系统上运行:-)),但您当然可以从汇编程序循环中获得一些东西: