每个处理器都有一个不同级别和大小的缓存。
以绝对所有使用数组、变量等的方式编写程序是否有意义?在 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
这取决于程序。如果她没事。通常是指这些变量,那么是的,当然——将其所有数据放在一个占用最少缓存行数的块中会加速这些操作。
您通常不会谈论将所有数据放在一个缓存行中。在实践中,这是不可能的。通常人们谈到数据块的“多尺寸”。
我认为与第一个问题没有太大区别。如果您的程序针对缓存加载进行了优化,并且考虑到了它的大小,当然,它会在具有大缓存的硬件上运行得更快。我希望你也知道缓存有不同的级别(level1、level2、level3、数据缓存、指令缓存),它们的大小可能不同,访问它们的速度当然也不同,即 优化领域非常广泛,因为您有耐心对各种硬件进行分类以进行实验和幻想以实现算法。
不。以这样一种方式在内核之间并行处理此处理是有意义的,即对于每个内核,这些数据部分(如果可能)不重叠。这里处理数据块大小的多样性是非常重要的。部分应该被划分,以便一个核心的现金线不会与另一个核心的现金线重叠。
关键是不要做额外的工作:如果您只需要移动一个数据块,并且您不访问它进行任何计算,则无需将其加载到缓存中。
不,不应该。至少在 64 位缓存行上,在非并行程序中顺序读取 128 位值不会带来任何好处。在这种情况下,缓存的大小和内核之间的并行性(缓存协作)将是决定性的。至少等待或寻找 256 位缓存线 :)