我正在检查英特尔的"whatif"网站及其事务内存编译器(每个线程必须进行原子提交或回滚系统的内存,就像数据库一样).
这似乎是替换锁和互斥锁的一种有前途的方法,但我找不到很多推荐.这里有人有任何意见吗?
有没有办法在运行Mac OS X的Core i7 mac上以编程方式禁用Turbo Boost?我需要能够在代码优化期间进行基准测试等.如果失败了,任何可以禁用/启用Turbo Boost的实用程序,即使它需要重新启动,也会很有用.
在SO上有一个相关的问题(不是特定于Mac):如何临时关闭Turbo Boost?但即使对于个人电脑来说,似乎也无法以编程方式/即时方式进行此操作?
我想知道是否有办法利用英特尔沙桥CPU中的新硬件真数发生器?我读到英特尔的MKL(数学内核库)公开了这个功能,但这需要MKL套件和英特尔编译器,结果相当昂贵.
有没有其他方法在我的C++代码中使用硬件随机数生成器?例如,一个不错的,仅标题库?
我在网上采用了衡量SSE绩效的方法.
#ifndef __TIMER_H__
#define __TIMER_H__
#pragma warning (push)
#pragma warning (disable : 4035) // disable no return value warning
__forceinline unsigned int GetPentiumTimer()
{
__asm
{
xor eax,eax // VC won't realize that eax is modified w/out this
// instruction to modify the val.
// Problem shows up in release mode builds
_emit 0x0F // Pentium high-freq counter to edx;eax
_emit 0x31 // only care about low 32 bits in eax
xor edx,edx // so VC gets that edx is …Run Code Online (Sandbox Code Playgroud) 我正在转换一个巨大的Windows DLL以在Windows和Linux上工作.dll有很多用于视频操作的汇编(和SS2指令).
现在,使用Windows上的Intel ComposerXE-2011和Linux上的Intel ComposerXE-2013 SP1中包含的英特尔编译器,可以在Windows和Linux上编译代码.
但是,在尝试调用函数指针时,执行会在Linux中崩溃.我在gdb中跟踪代码,实际上函数指针并没有指向所需的函数(而在Windows中则没有).几乎所有其他工作正常.
这是代码序列:
...
mov rdi, this
lea rdx, [rdi].m_sSomeStruct
...
lea rax, FUNCTION_NAME # if replaced by 'mov', works in Linux but crashes in Windows
mov [rdx].m_pfnFunction, rax
...
call [rdx].m_pfnFunction # crash in Linux
Run Code Online (Sandbox Code Playgroud)
哪里:
1)'this'有一个struct成员m_sSomeStruct.
2)m_sSomeStruct有一个成员m_pfnFunction,它是一个指向函数的指针.
3)FUNCTION_NAME是同一编译单元中的自由函数.
4)所有这些纯组装函数都声明为裸.
5)64位环境.
让我最困惑的是,如果我用'mov'指令替换应该将函数地址加载到rax中的'lea'指令,它在Linux上工作正常但在Windows上崩溃.我在Visual Studio和gdb中都跟踪了代码,显然在Windows"lea"中给出了正确的函数地址,而在Linux'mov'中则是这样.
我试着查看英特尔组装参考,但没有找到太多帮助我(除非我没有找对地方).
任何帮助表示赞赏.谢谢!
编辑更多详情:
1)我尝试使用方括号
lea rax, [FUNCTION_NAME]
Run Code Online (Sandbox Code Playgroud)
但这并未改变Windows和Linux中的行为.
2)我在gdb和Windows中查看了反汇编程序,似乎都给出了我实际编写的相同指令.更糟糕的是,我尝试将两个lea/ mov一个接一个地放在一起,当我在gdb的反汇编中查看它们时,在#符号之后的指令后打印的地址(我假设是将要存储的地址)在寄存器中)实际上是相同的,并且不是函数的正确地址.
它在gdb反汇编程序中看起来像这样
lea 0xOffset1(%rip), %rax # 0xSomeAddress
mov 0xOffset2(%rip), %rax # 0xSomeAddress
Run Code Online (Sandbox Code Playgroud)
其中两个(SomeAddress)是相同的,并且两个偏移都是由lea和mov指令之间的相同差异关闭的,但不知何故,当我在每次执行后检查寄存器的内容时,mov似乎放入了正确的值! !
3)成员变量m_pfnFunction的类型为LOAD_FUNCTION,定义为
typedef …Run Code Online (Sandbox Code Playgroud) 根据英特尔内部指南,
vxorpd ymm, ymm, ymm:计算a和b中打包的双精度(64位)浮点元素的按位XOR,并将结果存储在dst中.vpxor ymm, ymm, ymm:计算a和b中256位(表示整数数据)的按位XOR,并将结果存储在dst中.两者有什么区别?在我看来,两个指令都会对ymm寄存器的所有256位执行按位异或.如果我使用vxorpd整数数据会有任何性能损失(反之亦然)?
我想在XeonE5 Sandy Bridge上使用基于精确事件的采样(PEBS)来记录特定事件的所有地址(例如缓存未命中).
但是,Core TM i7处理器和Intel®XeonTM5500处理器性能分析指南(第24页)包含以下警告:
由于PEBS机制在指令完成时捕获寄存器的值,因此无法重建以下类型的加载指令(Intel asm约定)的解除引用的地址.
MOV RAX, [RAX+const]
这种指令主要与指针追逐相关联.
mystruc = mystruc->next;
这是捕获存储器指令地址的这种方法的重大缺点.
根据objdump,我在程序中有许多该表单的加载指令.有什么办法可以避免吗?
由于这是一个特定于英特尔的问题,解决方案不必以任何方式移植,它只需要工作.我的代码是用C语言编写的,我理想地寻找编译器级解决方案(gcc或icc),但欢迎任何建议.
一些例子:
mov 0x18(%rdi),%rdi
mov (%rcx,%rax,8),%rax
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,该指令退役之后(因此当我看到的寄存器值来找出我装到/从)的地址(分别的值%rdi + 18和%rcx + 8 * %rax这些实施例中)通过的结果重写mov.
我想购买一台新的开发PC.我的预算不超过1,000美元(包括显示器).我对笔记本电脑(台式机替代型)或传统台式电脑可以做得很好.
我的主要开发环境将是Microsoft,Visual Studio 2008(以及对旧版Visual Studio 6代码的支持).SQL Server 2005,2008以及SQL Server 2000的遗留支持.Microsoft Office 2003,可能安装2007但支持Office 2000.我将编写和支持的软件主要是Windows XP,但有些Vista.我将不得不假设有64位实现安装到.
我的第一个困惑始于选择AMD或英特尔.我担心的是在AMD环境中使用Visual Studio构建软件存在兼容性问题.我没有任何证据,只是担心有人会为我清理.
最后,我对32位和64位安装感到困惑.即使64位稳定上升,我应该坚持使用最小公分母(32位)吗?我知道64位操作系统将解决超过4G的RAM和我喜欢的问题,因为我想为测试环境设置尽可能多的虚拟机,并且可能会同时激活多个虚拟机.
我不是在寻找梦想的机器,只是一台带有显示器和最好的处理器的机器,价格大约1000美元,这将允许我为大多数机器编写软件.
在英特尔的优化指南 2.1.3节中,他们列出了Skylake中高速缓存和内存子系统的一些增强功能(强调我的):
Skylake微体系结构的缓存层次结构具有以下增强功能:
- 与前几代相比,缓存带宽更高.
- 通过扩大的缓冲区同时处理更多的装载和存储.
- 与Haswell微体系结构和前几代产品相比,处理器可以并行执行两次页面遍历.
- 页面拆分负载惩罚从上一代的100个周期下降到5个周期.
- L3写入带宽从上一代的4个周期增加到每行2个.
- 支持CLFLUSHOPT指令,使用SFENCE清除ca che line并管理刷新数据的内存排序.
- 降低了指定NULL指针的软件预取的性能损失.
- L2关联性从8种方式变为4种方式.
最后一个引起了我的注意.以什么方式减少增强方式的数量?就其本身而言,似乎更少的方式比更多方式更严重.当然,我认为可能存在有效的工程原因,为什么减少方式可以作为实现其他增强功能的权衡,但在这里,它本身定位为增强功能.
我错过了什么?
编辑3:图像是指向完整版本的链接.对于文本图片感到抱歉,但图表很难复制/粘贴到文本表中.
我有一个编译的程序的以下VTune配置文件icc --std=c++14 -qopenmp -axS -O3 -fPIC:
在该配置文件中,组装视图中突出显示了两组指令.尽管指令相同且顺序相同,但上部集群比下部集群花费的时间少得多.两个集群都位于同一个函数内,显然都被称为n时间.每次我运行探查器时都会发生这种情况,我现在正在使用Westmere Xeon和Haswell笔记本电脑(使用SSE编译,因为这就是我现在正在瞄准和学习的东西).
我错过了什么?
忽略糟糕的并发性,这很可能是由于笔记本电脑节流,因为它不会发生在桌面Xeon机器上.
我认为这不是微优化的一个例子,因为这三个加在一起相当于总时间的百分之一,我真的对这种行为的可能原因感兴趣.
编辑: OMP_NUM_THREADS=1 taskset -c 1 /opt/intel/vtune...
相同的资料,虽然此次CPI略低.