当前位置: 首页 > 知识库问答 >
问题:

在x86和ARM中移动内存的最佳方式?

杨无尘
2023-03-14

我很想知道在x86架构上实现大容量内存拷贝的最佳方法。我意识到这取决于机器的特定特性。主要目标是过去4-5年制造的典型台式机。

我知道在过去,带有REPE的MOVSD名义上是最快的方法,因为您可以一次移动4个字节,但我读到现在MOVSB同样快速且编写更简单,所以您不妨进行字节移动,忘记4字节移动的复杂性。

一个围绕的问题是MOVxx指令是否值得。如果CPU的运行速度比内存总线快得多,那么使用CISC移动可能毫无意义,您也可以使用普通MOV。这将是最有吸引力的,因为这样我就可以在其他处理器架构(如ARM)上使用相同的算法。这就提出了一个类似的问题:ARM针对大容量内存移动的专门指令(与Intels完全不同)是否值得。

注意:我已经阅读了英特尔优化参考手册中的第3.7.6节,因此我熟悉基础知识。我希望有人能在本手册之外的领域提供实践经验。

共有1个答案

杜河
2023-03-14

现代英特尔和AMD处理器对REP MOVSB进行了优化,使其能够一次复制整个缓存行,使其成为复制批量数据的最佳(可能不是最快的,但非常接近)方法。

至于ARM,这取决于架构版本,但通常使用展开循环是最有效的。

 类似资料:
  • 所以我有一个角色,我做了一个矩形来遮盖他的身体,以便与敌人交叉,这样当他与敌人相交时,他会受伤。我遇到的问题是,他有一把剑,剑在他身后以一个角度,因为他随身携带它,当玩家攻击时,动画被播放,剑摆动,越过他的头,落在他面前。我有一个多边形,在空闲/运行位置勾勒出剑的轮廓,但我不知道是否值得尝试在攻击动画的每一帧中手动移动多边形,然后检查动画每一帧的重叠ConvexPolygons,看看剑是否击中了敌

  • 最近我开始在后端工作(对于我的个人项目),我选择了nestjs,对于ORM,我选择了typeorm。 现在我需要自定义存储库,这样我就可以拥有一个抽象的基本存储库,它实现所有需要的方法,然后在实际的实体存储库中继承这些方法。那么,我如何构建我的项目呢?我应该创建一个导出所有存储库的模块,还是有其他有效的方法?

  • 我正在寻找一种方法来移动arch64寄存器x1中的任何32位常数。 是否有一种方法可以执行

  • 以下所有指令都执行相同的操作:将设置为零。哪种方式是最优的(需要最少的机器周期)?

  • 我试图理解java volatile的本质及其语义,以及它对底层架构和指令的转换。如果我们考虑以下博客和资源 生成的栅栏的易失性,什么得到生成的读/写的易失性和堆栈溢出问题上的栅栏 以下是我收集的信息: volatile read在其后面插入loadStore/LoadLoad屏障(x86上的LFENCE指令) 它可以防止在后续写入/加载时对加载进行重新排序 它应该保证加载由其他线程修改的全局状态

  • 目标:在OpenCL中实现下面所示的图表。OpenCl内核需要做的主要工作是将系数数组和临时数组相乘,然后在最后将所有这些值累加为一。(这可能是时间最密集的操作,并行性在这里非常有用)。 我正在为执行乘法和加法的内核使用一个辅助函数(我希望这个函数也是并行的)。 图片描述: 每次一个值被传递到与系数数组大小相同的数组(临时数组)中。现在,每次一个值被传递到这个数组中,临时数组都会并行地与系数数组相