标签: cpu

每个循环的FLOPS用于沙桥和haswell SSE2/AVX/AVX2

我对使用Sandy-Bridge和Haswell可以完成每个核心每个循环的触发器感到困惑.据我所知,对于SSE,每个核心每个周期应该为4个触发器,对于AVX/AVX2,每个核心每个周期应该有8个触发器.

这似乎在这里得到验证, 如何实现每个周期4个FLOP的理论最大值? ,这里, Sandy-Bridge CPU规范.

然而,下面的链接似乎表明,Sandy-bridge每个核心每个周期可以执行16个触发器,每个核心每个循环使用Haswell 32个触发器 http://www.extremetech.com/computing/136219-intels-haswell-is-an-前所未有-threat-to-nvidia-amd.

谁可以给我解释一下这个?

编辑:我现在明白为什么我感到困惑.我认为术语FLOP仅指单浮点(SP).我现在看到如何在每个循环中实现理论最大值4 FLOP的测试实际上是双浮点(DP),因此它们为SSE实现4个DP FLOP /周期,为AVX实现8个DP FLOP /周期.在SP上重做这些测试会很有趣.

cpu intel cpu-architecture avx flops

49
推荐指数
2
解决办法
6万
查看次数

每个汇编指令需要多少个CPU周期?

我听说有英特尔在线书籍描述了特定汇编指令所需的CPU周期,但我无法找到它(经过努力).有人能告诉我如何找到CPU周期吗?

下面是一个例子,在下面的代码中,mov/lock是1个CPU周期,xchg是3个CPU周期.

// This part is Platform dependent!
#ifdef WIN32
inline int CPP_SpinLock::TestAndSet(int* pTargetAddress, 
                                              int nValue)
{
    __asm
    {
        mov edx, dword ptr [pTargetAddress]
        mov eax, nValue
        lock xchg eax, dword ptr [edx]
    }
    // mov = 1 CPU cycle
    // lock = 1 CPU cycle
    // xchg = 3 CPU cycles
}

#endif // WIN32
Run Code Online (Sandbox Code Playgroud)

顺便说一句:这是我发布的代码的URL:http://www.codeproject.com/KB/threads/spinlocks.aspx

cpu assembly cycle

48
推荐指数
5
解决办法
5万
查看次数

如何在x86 Windows中执行CPU缓存刷新?

我感兴趣的是在Windows中强制CPU缓存刷新(出于基准测试的原因,我想模拟从CPU缓存中没有数据开始),最好是基本的C实现或Win32调用.

是否有一种已知的方法可以通过系统调用来执行此操作,甚至可以像执行大型操作一样偷偷摸摸地执行此操作memcpy

英特尔i686平台(P4及以上版本也可以).

c windows cpu x86 cpu-cache

46
推荐指数
2
解决办法
3万
查看次数

如何在Linux/Windows上测量CPU时间和挂钟时间?

我的意思是:我如何测量我的CPU花在功能执行上的时间和运行我的功能所需的挂钟时间?(我对Linux/Windows以及x86和x86_64感兴趣).看看我想做什么(我在这里使用C++,但我更喜欢C解决方案):

int startcputime, endcputime, wcts, wcte;

startcputime = cputime();
function(args);
endcputime = cputime();

std::cout << "it took " << endcputime - startcputime << " s of CPU to execute this\n";

wcts = wallclocktime();
function(args);
wcte = wallclocktime();

std::cout << "it took " << wcte - wcts << " s of real time to execute this\n";
Run Code Online (Sandbox Code Playgroud)

另一个重要问题是:这种类型的时间测量架构是否独立?

c c++ cpu performance time

46
推荐指数
3
解决办法
7万
查看次数

无法启动Genymotion虚拟设备,不兼容的CPU

我第一次运行Genymotion虚拟设备时,它已经运行了.但是当我今天尝试运行它时,我收到了此错误消息

在此输入图像描述

从我上次使用它可能有什么变化?将会感激我能获得的任何解决方案.谢谢.

我的设备信息:戴尔XPS L502X Sandy Bridge主板英特尔酷睿i5-2410M @ 2.30 GHz Windows 7专业版64位

cpu android windows-7-x64 genymotion

45
推荐指数
7
解决办法
6万
查看次数

微融合和寻址模式

我使用英特尔®架构代码分析器(IACA)发现了一些意想不到的东西(对我而言).

以下指令使用[base+index]寻址

addps xmm1, xmmword ptr [rsi+rax*1]
Run Code Online (Sandbox Code Playgroud)

根据IACA没有微熔丝.但是,如果我用[base+offset]这样的

addps xmm1, xmmword ptr [rsi]
Run Code Online (Sandbox Code Playgroud)

IACA报告它确实融合了.

英特尔优化参考手册的第2-11节给出了以下"可以由所有解码器处理的微融合微操作"的示例

FADD DOUBLE PTR [RDI + RSI*8]
Run Code Online (Sandbox Code Playgroud)

Agner Fog的优化装配手册也给出了使用[base+index]寻址的微操作融合的例子.例如,请参见第12.2节"Core2上的相同示例".那么正确的答案是什么?

cpu x86 assembly intel iaca

44
推荐指数
4
解决办法
4504
查看次数

C++中的CPU限制

我只是想知道是否有一种优雅的方法来设置特定线程进行密集计算的最大CPU负载.

现在我已经找到了最耗时的线程循环(它只能压缩)和使用GetTickCount(),并Sleep()用硬编码值.它确保循环持续一段时间,而不是睡眠一段时间.它或多或少的工作,即保证线程不会使用超过50%的CPU.
然而,行为取决于CPU核心的数量(巨大的劣势)和简单的丑陋(较小的劣势:)).
有任何想法吗?

c++ cpu performance throttling

43
推荐指数
2
解决办法
4119
查看次数

用Java限制线程的CPU /内存使用率?

我正在编写一个运行多个线程的应用程序,并希望限制这些线程的CPU /内存使用量.

对于C++也存在类似的问题,但我想尽可能避免使用C++和JNI.我意识到使用更高级别的语言可能无法做到这一点,但我很想知道是否有人有任何想法.

编辑:增加了赏金; 我想要一些非常好的,深思熟虑的想法.

编辑2:我需要的情况是在我的服务器上执行其他人的代码.基本上它是完全任意的代码,唯一的保证是类文件上会有一个main方法.目前,在运行时加载的多个完全不同的类作为单独的线程并发执行.

它的编写方式,重构为每个执行的类创建单独的进程将是一件痛苦的事.如果这是通过VM参数限制内存使用的唯一好方法,那么就这样吧.但是我想知道是否有办法用线程来做.即使作为一个单独的进程,我也希望能够以某种方式限制其CPU使用率,因为正如我之前提到的,其中一些将立即执行.我不想要一个无限循环来占用所有资源.

编辑3:一种简单的近似对象大小的方法是使用java的Instrumentation类; 特别是getObjectSize方法.请注意,使用此工具需要一些特殊设置.

java memory cpu multithreading throttling

42
推荐指数
3
解决办法
3万
查看次数

如何在C#中快速获取Hardware-ID?

我需要在我的程序中将许可证绑定到硬件ID.我尝试过使用WMI,但它仍然很慢.

我需要,例如,CPU,HDD和主板信息.

.net c# hardware cpu hardware-id

41
推荐指数
3
解决办法
9万
查看次数

什么时候需要x86 LFENCE,SFENCE和MFENCE指令?

好吧,我已经从SO关于x86处理器围栏阅读下列适量(LFENCE,SFENCEMFENCE):

和:

而且我必须说实话,我还不能确定何时需要围栏.我试图从删除完全锁定并尝试通过栅栏使用更细粒度的锁定的角度来理解,以最小化延迟延迟.

首先,这是我不明白的两个具体问题:

有时在进行存储时,CPU会写入其存储缓冲区而不是L1缓存.但是,我不了解CPU执行此操作的条款?

CPU2可能希望加载已写入CPU1的存储缓冲区的值.据我了解,问题是CPU2无法在CPU1的存储缓冲区中看到新值.为什么MESI协议不能将刷新存储缓冲区作为其协议的一部分?

更一般地,可以请人试图描述的总体方案,并帮助时解释LFENCE/ MFENCESFENCE被需要的指令?

NB阅读本主题的一个问题是,当我只对Intel x86-64架构感兴趣时,"通常"为多CPU架构编写的文章数量.

cpu x86 assembly multithreading memory-fences

40
推荐指数
1
解决办法
2万
查看次数