标签: intel

有没有人尝试过C++的事务性内存?

我正在检查英特尔的"whatif"网站及其事务内存编译器(每个线程必须进行原子提交或回滚系统的内存,就像数据库一样).

这似乎是替换锁和互斥锁的一种有前途的方法,但我找不到很多推荐.这里有人有任何意见吗?

c++ multithreading locking transactional-memory intel

10
推荐指数
1
解决办法
4826
查看次数

在Core i7 Mac上禁用Turbo Boost?

有没有办法在运行Mac OS X的Core i7 mac上以编程方式禁用Turbo Boost?我需要能够在代码优化期间进行基准测试等.如果失败了,任何可以禁用/启用Turbo Boost的实用程序,即使它需要重新启动,也会很有用.

在SO上有一个相关的问题(不是特定于Mac):如何临时关闭Turbo Boost?但即使对于个人电脑来说,似乎也无法以编程方式/即时方式进行此操作?

macos intel

10
推荐指数
2
解决办法
8444
查看次数

利用沙桥的硬件真随机数发生器?

我想知道是否有办法利用英特尔沙桥CPU中的新硬件真数发生器?我读到英特尔的MKL(数学内核库)公开了这个功能,但这需要MKL套件和英特尔编译器,结果相当昂贵.

有没有其他方法在我的C++代码中使用硬件随机数生成器?例如,一个不错的,仅标题库?

c++ hardware numbers intel generator

10
推荐指数
2
解决办法
4087
查看次数

这个时钟是否适用于Intel i3?

我在网上采用了衡量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)

c++ performance intel performancecounter

10
推荐指数
1
解决办法
565
查看次数

C++内联汇编(英特尔编译器):LEA和MOV在Windows和Linux中表现不同

我正在转换一个巨大的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)

c c++ linux assembly intel

10
推荐指数
1
解决办法
675
查看次数

AVX指令vxorpd和vpxor之间的区别

根据英特尔内部指南,

  • vxorpd ymm, ymm, ymm:计算a和b中打包的双精度(64位)浮点元素的按位XOR,并将结果存储在dst中.
  • vpxor ymm, ymm, ymm:计算a和b中256位(表示整数数据)的按位XOR,并将结果存储在dst中.

两者有什么区别?在我看来,两个指令都会对ymm寄存器的所有256位执行按位异或.如果我使用vxorpd整数数据会有任何性能损失(反之亦然)?

intel simd vectorization xor avx

10
推荐指数
1
解决办法
2722
查看次数

将指令的目标地址保持在寄存器中,直到指令退出

我想在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.

c assembly intel performancecounter cpu-registers

10
推荐指数
1
解决办法
150
查看次数

开发PC:AMD vs Intel和32-bit与64-bit

我想购买一台新的开发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美元,这将允许我为大多数机器编写软件.

64-bit 32-bit intel amd-processor

9
推荐指数
1
解决办法
5388
查看次数

通过降低关联性来增强Skylake L2缓存?

英特尔的优化指南 2.1.3节中,他们列出了Skylake中高速缓存和内存子系统的一些增强功能(强调我的):

Skylake微体系结构的缓存层次结构具有以下增强功能:

  • 与前几代相比,缓存带宽更高.
  • 通过扩大的缓冲区同时处理更多的装载和存储.
  • 与Haswell微体系结构和前几代产品相比,处理器可以并行执行两次页面遍历.
  • 页面拆分负载惩罚从上一代的100个周期下降到5个周期.
  • L3写入带宽从上一代的4个周期增加到每行2个.
  • 支持CLFLUSHOPT指令,使用SFENCE清除ca che line并管理刷新数据的内存排序.
  • 降低了指定NULL指针的软件预取的性能损失.
  • L2关联性从8种方式变为4种方式.

最后一个引起了我的注意.以什么方式减少增强方式的数量?就其本身而言,似乎更少的方式比更多方式更严重.当然,我认为可能存在有效的工程原因,为什么减少方式可以作为实现其他增强功能的权衡,但在这里,它本身定位为增强功能.

我错过了什么?

cpu x86 intel cpu-cache

9
推荐指数
1
解决办法
534
查看次数

什么可能导致相同的SSE代码在同一个函数中运行速度慢几倍?

编辑3:图像是指向完整版本的链接.对于文本图片感到抱歉,但图表很难复制/粘贴到文本表中.


我有一个编译的程序的以下VTune配置文件icc --std=c++14 -qopenmp -axS -O3 -fPIC:

VTune简介

在该配置文件中,组装视图中突出显示了两组指令.尽管指令相同且顺序相同,但上部集群比下部集群花费的时间少得多.两个集群都位于同一个函数内,显然都被称为n时间.每次我运行探查器时都会发生这种情况,我现在正在使用Westmere Xeon和Haswell笔记本电脑(使用SSE编译,因为这就是我现在正在瞄准和学习的东西).

我错过了什么?

忽略糟糕的并发性,这很可能是由于笔记本电脑节流,因为它不会发生在桌面Xeon机器上.

我认为这不是微优化的一个例子,因为这三个加在一起相当于总时间的百分之一,我真的对这种行为的可能原因感兴趣.

编辑: OMP_NUM_THREADS=1 taskset -c 1 /opt/intel/vtune...

VTune简介

相同的资料,虽然此次CPI略低.

c++ optimization sse intel intel-vtune

9
推荐指数
1
解决办法
241
查看次数