我正在尝试创build自旋锁的哑版。 浏览网页时,我遇到了x86中的汇编指令,这个指令用于向处理器提示当前在该CPU上正在运行旋转locking。 英特尔手册和其他可用信息状态 The processor uses this hint to avoid the memory order violation in most situations, which greatly improves processor performance. For this reason, it is recommended that a PAUSE instruction be placed in all spin-wait loops. The documentation also mentions that "wait(some delay)" is the pseudo implementation of the instruction. 上段的最后一行是直观的。 如果我没有成功抓住锁,我必须等待一段时间,然后再次抓住锁。 但是,在自旋锁的情况下,由于内存顺序违反,我们是什么意思? […]
在最后几天,我观察到我无法解释的新工作站的行为。 对这个问题做了一些研究, INTEL Haswell架构和当前Skylake Generation中可能存在一个bug。 在撰写关于可能的错误之前,让我给你一个使用的硬件,程序代码和问题本身的概述。 工作站硬件规范 英特尔至强E5-2680 V3 2500MHz 30Mcaching12核 Supermicro SC745 BTQ -R1K28B-SQ 4 x 32GB ECC Registered DDR4-2133 Ram INTEL SSD 730系列480 GB NVIDIA Tesla C2075 NVIDIA TITAN 有问题的操作系统和程序代码 我目前正在运行Ubuntu 15.04 64位桌面版本,最新的更新和内核的东西安装。 除了使用这台机器开发CUDA内核和东西,我最近testing了一个纯C程序。 该程序正在对相当大的input数据集进行一些修改后的ART 。 所以代码执行一些FFT并花费相当多的时间来完成计算。 我目前无法发布/链接到任何源代码,因为这是正在进行的研究,无法发布。 如果你不熟悉ART ,只是简单的解释一下。 ART是一种技术,用于重build从计算机断层摄影机接收到的数据,以获取可见的图像进行诊断。 所以我们的代码版本重build了像2048x2048x512这样的大小的数据集。 到目前为止,没有什么特别的,也没有涉及火箭科学。 经过几个小时的debugging和修复错误,代码在参考结果上进行了testing,我们可以确认代码的工作原理。 代码使用的唯一的库是标准的math.h 没有特殊的编译参数,没有额外的库的东西,可能会带来额外的问题 。 观察问题 该代码使用一种技术来实现ART,以最小化重构数据所需的投影。 那么我们假设我们可以重build一个包含25个投影的数据片。 代码在12个内核上以完全相同的input数据启动。 请注意,该实现不是基于multithreading,目前启动了12个程序实例。 我知道这不是最好的办法,涉及适当的线程pipe理是非常build议,这已经在改善列表:) […]
我可以理解如何编写一个使用多个进程或线程的程序:fork()一个新进程并使用IPC,或者创build多个线程并使用这些types的通信机制。 我也理解上下文切换。 也就是说,只有一个CPU,操作系统为每个进程安排时间(并且有大量的调度algorithm在那里),从而实现同时运行多个进程。 而现在我们有了多核处理器(或者多处理器的计算机),我们可以在两个独立的内核上同时运行两个进程。 我的问题是关于最后的情况:内核如何控制一个进程运行的核心? 哪些系统调用(在Linux甚至Windows中)在特定内核上调度进程? 我问这个问题的原因是:我正在为一个项目寻找计算方面的最新课题 – 我select了多核架构。 在如何在这种环境下编程(如何监视死锁或竞赛状况)似乎有很多材料,但在控制单个核心本身方面却没有太多的材料。 我希望能够编写一些演示程序,并给出一些汇编指令或C代码,以便大意:“看,我在第二个内核上运行一个无限循环,查看特定内核的 CPU利用率高峰” 。 任何代码示例? 还是教程? 编辑:澄清 – 很多人都说这是操作系统的目的,而且应该让操作系统照顾这个。 我完全同意! 但是,我所要求的(或试图去感受)是操作系统实际做到的。 不是调度algorithm,而是更多“一旦核心被选中,必须执行什么指令才能让核心开始获取指令?
从Pentium Pro(P6微架构)开始,Intel重新devise了微处理器,并在旧的CISC指令下使用了内部RISC内核。 由于Pentium Pro的所有CISC指令被分成较小的部分(uops),然后由RISC内核执行。 在开始的时候,我很清楚Intel决定隐藏新的内部架构,并迫使程序员使用“CISC shell”。 由于这个决定,英特尔可以完全重新devise微处理器架构,而不会破坏兼容性,这是合理的。 不过我不明白一件事,为什么Intel这么多年来还隐藏着一套内部RISC指令? 为什么他们不让程序员像使用旧的x86 CISC指令集一样使用RISC指令? 如果英特尔长期保持向后兼容性(我们在64位模式旁仍然有虚拟8086模式),为什么不让我们编译程序,以便它们能够绕过CISC指令并直接使用RISC内核? 这会慢慢地放弃x86指令集的自然方式,现在已经废弃了(这是英特尔决定使用RISC内核的主要原因吧?)。 看看我看到的新的Intel Core i系列,他们只扩展了CISC指令集,添加了AVX,SSE4等等。
对于Intel体系结构,是否有办法指示GCC编译器生成代码,这些代码始终会在代码中以特定方式强制执行分支预测? 英特尔硬件是否支持这个? 其他编译器或硬件呢? 我会在C ++代码中使用它,我知道我希望快速运行的情况下,而不必关心其他分支即使最近采取该分支时需要采取的减速。 for (;;) { if (normal) { // How to tell compiler to always branch predict true value? doSomethingNormal(); } else { exceptionalCase(); } } 作为Evdzhan Mustafa的后续问题,提示只是第一次指出处理器遇到该指令时的提示,所有后续的分支预测,function是否正常?
我试图在我的电脑上运行我的Hello World世界的Android Studio应用程序,但得到以下信息: 模拟器:错误:x86模拟目前需要硬件加速! 请确保英特尔HAXM已正确安装和使用。 CPU加速状态:未安装HAX内核模块! 你能告诉我我能用这个错误做什么吗?
我正在尝试使用适用于Windows的Intel HAX x86模拟器(如果有的话)。 我安装了所有东西,并为android版本创build了一个AVD,并且所有东西都显示正确,但是当我运行它时,我得到了这个输出: Starting emulator for AVD 'x86_QVGA_Level10' emulator: device fd:1044 HAX is working and emulator runs in fast virt mode emulator: Failed to sync vcpu reg emulator: Failed to sync HAX vcpu context 并且模拟器不会运行。 这个错误的重要组成部分(Failed to sync vcpu reg)是不是在任何地方都提到,除了在HAX本身的源代码 ,但我不知道如何使这个任何意义。 任何人都可以build议如何通过这个错误? 我真的需要得到这个工作,因为在设备上和默认的模拟器debugging是痛苦的慢。
我很困惑,Sandy-Bridge和Haswell可以完成每个核心每个周期的触发器数量。 就我所了解的SSE而言,对于AVX / AVX2来说,SSE每个内核每个周期应该有4个触发器,而每个内核每个周期应该有8个触发器。 这似乎在这里得到validation, 我怎样才能达到每个周期4 FLOP的理论最大值? ,以及Sandy-Bridge CPU规格 。 然而,下面的链接似乎表明,Sandy-bridge每个内核每个周期可以执行16个触发器,而每个内核每个周期可以执行Haswell 32个触发器http://www.extremetech.com/computing/136219-intels-haswell-is-an-universe威慑nvidia-amd 。 谁可以给我解释一下这个? 编辑:我现在明白为什么我感到困惑。 我认为术语FLOP只涉及单浮点(SP)。 我现在看到,testing如何达到每个周期4 FLOP的理论最大值? 实际上是双浮点(DP),因此它们为SSE实现4个DP FLOP /周期,为AVX实现8个DP FLOP /周期。 在SP上重做这些testing会很有趣。
我有一个AMD处理器的Windows 8.1专业版。 我安装了Android SDK和Eclipse。 它的工作原理,但问题是,当我创buildAVD并启动它显示此错误: 模拟器:错误:x86模拟目前需要硬件加速! 请确保英特尔HAXM已正确安装和使用。 CPU加速状态:未安装HAX内核模块! 我已经安装了Intel Hardware_Accelerated_Execution_Manager,并且已经从启动菜单启用虚拟调制,但是它仍然不能工作。