每个处理器都有一个不同级别和大小的缓存。
以绝对所有使用数组、变量等的方式编写程序是否有意义?在 RAM 中占用严格的顺序地址?那些。例如:起始地址
90870000,结束90880000。这个间隔仅是特定程序的数据是否有意义?缓存大小与所用 RAM 大小的比例如何影响程序的速度?
以块为单位处理数倍于缓存大小的数据是否有意义?每个块都小于缓存大小。
汇编器有在不使用缓存的情况下写入 RAM 的指令。这有什么意义?
这两条指令中的哪一条以及在什么情况下应该用于将 128 位的处理结果返回到内存?
movdqu [ebx],xmm0 movntps [ebx],xmm0//без использования кэша
我是否正确理解,如果逆向工程不再需要这些 128 位,那么 movntps 会更好吗?它更快吗?
假设有一个黑白bmp图像1024*1024。让我们将其所有像素转移到:
unsigned __int8 *src_img src_img = new unsigned __int8[1024*1024];//каждый байт это значение одного пикселя от 0 до 255
假设该算法有两种变体:
1) 将 128 位从 src_img 复制到 xmm0,在 xmm 寄存器中执行一些操作并将更改后的 128 位返回到 RAM 中的相同地址。最重要的是,这 128 位是从 src_img 的开头到结尾依次选择的。
2)我们也这样做,但是不是顺序选择128位,而是从不同的地方选择 src_img
第一个选项会不会更快?或者换一种说法:最初程序从以下位置获取数据:movdqu xmm0,[ebx]。程序在接下来的 128 位距离原始地址多远对性能有影响吗?
我在此任务的背景下研究了这些问题: https ://stackoverflow.com/questions/50747393/prewitt-edge-detection-algorithm-using-x86-mmx-simd