Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 暂停应用程序的所有内存访问_Performance_Assembly_Memory_X86 64_Amd - Fatal编程技术网

Performance 暂停应用程序的所有内存访问

Performance 暂停应用程序的所有内存访问,performance,assembly,memory,x86-64,amd,Performance,Assembly,Memory,X86 64,Amd,我想分析在应用程序中使用较慢内存的影响,并需要一种为所有内存访问增加延迟的方法。到目前为止,我一直在调查英特尔PIN码和其他软件,但对于我所需要的东西来说,这些软件似乎有些过头了。有什么工具可以这样做吗 在每次加载/存储之前在应用程序的二进制代码中添加NOP操作是否可行?您最好在x86模拟器(如或)下运行应用程序。使用这些模拟器,您可以平稳地改变建模的内存延迟或system1的任何其他参数,并查看应用程序性能如何变化。这是学术界常用的方法(通常会对通用机器进行建模,而不是对x86进行建模,这使您

我想分析在应用程序中使用较慢内存的影响,并需要一种为所有内存访问增加延迟的方法。到目前为止,我一直在调查英特尔PIN码和其他软件,但对于我所需要的东西来说,这些软件似乎有些过头了。有什么工具可以这样做吗


在每次加载/存储之前在应用程序的二进制代码中添加NOP操作是否可行?

您最好在x86模拟器(如或)下运行应用程序。使用这些模拟器,您可以平稳地改变建模的内存延迟或system1的任何其他参数,并查看应用程序性能如何变化。这是学术界常用的方法(通常会对通用机器进行建模,而不是对x86进行建模,这使您可以访问更多的模拟器实现)

使用模拟器的主要缺点是,即使是好的模拟器也不是完全精确的,精确程度取决于所讨论的代码。在回答“性能如何随延迟而变化”这一问题时,与实际性能的某些差异并不是特别有问题,但如果模拟器不能很好地模拟内存访问路径,那么可能会得出一个与实际情况相去甚远的答案

如果您真的不能使用模拟,您可以使用任何二进制重写工具(如PIN)来检测内存访问位置
nop
将是一个错误的选择,因为它执行得非常快,因为您无法在内存加载结果和nop指令之间添加依赖项。后一个问题意味着它只在每个负载的位置添加额外的“工作”,但工作独立于负载本身,因此不会模拟增加的内存延迟

更好的方法是使用长延迟操作跟踪每个负载,该操作使用负载的结果作为输入和输出(但不修改它)。如果
reg
收到加载结果,可能会出现类似
imul reg,reg,1
的情况(但这只会增加3个周期,因此如果要增加大量延迟,您可能会寻找更长的延迟指令)



1至少在模拟器模拟的一组事物中。

我认为您可以降低BIOS中的内存时钟并关闭缓存。你在为什么平台编程?x86_64,普通计算机,哪种CPU型号?哪个芯片组?可能没有通用的方法来做您想要的事情,但是单个CPU和芯片组可能有方法。您可能还想查看cachegrind,一种模拟缓存行为的工具。我们有Intel 2630v4、AMD Opteron 6272和Intel Xeon E5-2620 CPU。
推送reg
/
弹出reg
(使用红色区域的代码不安全)或者将存储/重新加载到每个线程的静态位置会有更多的延迟,但随后会为存储加载/存储端口引入额外的UOP,并在存储缓冲区中引入更多的活动。这取决于你们想学什么,可能没问题。有一些关于负载延迟的性能模型的建议,可以只使用现代Intel和AMD处理器中可用的硬件性能计数器来实现。它们可以并且已经被用于在软件中模拟较慢的负载延迟。与模拟器相比,这些技术基本上没有性能开销(因为它们根本不进行任何模拟)。相对于真实硬件,它们也更精确,并且可以在真实硬件上测量仿真误差。问题是还没有人提出这样的模型。。。。。。对于商店延迟(有几个建议,但它们实际上不起作用)。因此,当前如果需要模拟较慢的存储延迟,唯一的方法是使用您建议的模拟器。通常,实际程序受加载延迟的影响要比存储延迟大得多。但也有一些现有的和新兴的项目,商店延迟确实会产生重大影响。不过我不同意你的第二个建议,因为我认为错误太大了。@HadiBrais-我或多或少完全忽略了存储延迟,因为这里甚至不清楚你想要什么。是否要在存储出现在存储缓冲区中之前添加时间?这看起来很奇怪,但用仪器是可行的。当存储即将准备离开缓存线时,是否要为缓存线的RFO请求添加时间?这看起来更像是你想要的,但我看不到任何实现它的方法,没有硬件支持。当然,伙计。我(目前)最喜欢的英特尔机型是AMD,请查看。模拟写延迟的失败尝试的一个例子是(虽然我不尊重作者,但我感谢他们的努力)。