英特尔在x86处理器中实现了哪种整数除法算法?
在兼容x86的加速器MIC Intel Xeon Phi中是否有SIMD(SSE/AVX)指令?
我正在学习OpenCL编程,并注意到一些奇怪的东西.
也就是说,当我在我的机器上列出所有支持OpenCL的设备(Macbook Pro)时,我得到以下列表:
第一个是我的CPU,第二个是英特尔的板载图形解决方案,第三个是我的专用显卡.
研究表明,英特尔已将其硬件OpenCL兼容,以便我可以利用板载图形单元的强大功能.那将是Iris Pro.
考虑到这一点,CPU与OpenCL兼容的目的是什么?仅仅为了方便,内核可以在CPU上运行,因为备份不应该找到其他卡,或者当运行代码作为OpenCL内核而不是常规(C,良好线程)程序时,是否存在任何速度优势中央处理器?
在之前的Stackoverflow 回答中,玛格丽特·布鲁姆 (Margaret Bloom) 说道:
\n\n\n\n\n唤醒 AP
\n\n这是通过向所有 AP 发出 INIT-SIPI-SIPI (ISS) 序列来实现的。
\n\n将发送 ISS 序列的 BSP 使用“全部排除自身”简写作为目的地,从而针对所有 AP。
\n\nSIPI(启动处理器间中断)会被所有在收到 SIPI 时被唤醒的 CPU 忽略,因此,如果第一个 SIPI 足以唤醒目标处理器,则第二个 SIPI 将被忽略。出于兼容性原因,英特尔建议这样做。
\n
我多年来一直在编写多处理代码,我对硬件的观察是,在某些处理器上,它似乎与所述不同。我很确定我已经观察到应用处理器 (AP) 在收到启动 IPI 后修改了其指令指针,即使它处于活动状态(不在等待启动 IPI 中)。
\n\n是否有任何英特尔文档说明 AP在不处于等待启动 IPI 状态时收到启动 IPI 后将执行的操作,或将行为记录为未定义?我似乎无法在英特尔软件文档手册或补充英特尔文档Minimal Boot Loader for Intel\xc2\xae Architecture中找到明确的答案。
\n\n通常,我编写初始化代码来初始化并启动 AP,假设 AP 可以获取 SIPI 并在活动状态(而不是等待启动 IPI 状态)下重置其指令指针。
\n\n我正在尝试确定 Margaret Bloom 声明的准确性,即先前已唤醒的 …
在这篇文章和这篇文章之后,我正在这个 GitHub Gistmain.c上编译代码。
运行 CMake 命令find_package(OpenCL REQUIRED)我得到这个:
-- 寻找 CL_VERSION_2_2 - 已找到 -- 找到 OpenCL: C:/Program Files (x86)/IntelSWTools/system_studio_2020/OpenCL/sdk/lib/x86/OpenCL.lib (找到版本“2.2”)
表明已找到 OpenCL SDK 版本 2.2。这与我从clinfo工具中检测到适用于英特尔 SDK/平台的 1.2 OpenCL 的结果相矛盾。现在,当运行可执行文件时,我得到:
cl_version.h:CL_TARGET_OPENCL_VERSION 未定义。默认为 220 (OpenCL 2.2)
我的问题是:
clinfo?PS 这是输出cmake .. --debug-find
Intel 硬件预取器 Intel 网站显示有四种硬件预取器。由第 3 位控制的预取器是 L1 步幅预取器。我正在运行一个测试代码来测试 stride 预取器的触发条件是什么。我按照以下步骤运行代码(将 MSR0x1a4 设置为 0x7,这意味着仅启用基于 L1 IP 的 strider 预取器):
repeat following for 10000 times:
flush
training phase: access line 0 3 6 9
sleep for near 1000 cycles
measure phase: measure line 12
Run Code Online (Sandbox Code Playgroud)
我希望看到第 12 行被预取到缓存中。但是我只能看到缓存中的第 0 3 6 9 行被命中。即使我更改了步幅或访问模式的长度,也无法观察到步幅预取活动。所以我想知道是否有人在英特尔处理器中看到过预取活动,或者有一些我没有注意到的特殊触发条件?
对这个案例有兴趣的可以试一下测试代码。运行sudo ./run.sh就可以了。我的机器上的结果显示,第 12 行的访问时间大多大于 180 个周期。我认为时间测量代码没有问题,因为如果我将测量的行从缓存行 12 更改为缓存行 6(只需在 test.c,第 103 行更改),那么访问时间主要是 25 个周期。
首先,我不知道我是否应该在这里问这个问题,或者在 Electronics StackExchange 中问这个问题,所以如果您认为我应该在那里问这个问题,请告诉我。
我对测量 Intel CPU 中每个 CPU 核心的能耗感兴趣。我已阅读 Intel 的 Intel 64 开发人员手册,据我了解,RAPL 将提供以下方面的能耗估算:
这表明我能期望的最好结果是 CPU 中所有内核的集体能耗值。然而,我也知道“RAPL不是模拟功率计,而是使用软件功率模型”,根据https://01.org/blogs/2014/running-average-power-limit-%E2%80 %93-rapl。
我想知道的是,这个模型的工作方式是已知的还是公开的?并且,是否可以使用 RAPL 或其他接口提供的指标来估计各个核心功耗?我知道,如果英特尔不通过 RAPL 提供此信息,则可能无法获得它,但我想至少找到一个证实这一点的来源。
感谢您的帮助!
尽管单词的常见定义(如维基百科所述)是:
用于指定存储器中的位置的最大可能地址大小通常是硬件字(这里,“硬件字”是指处理器的全尺寸自然字,而不是使用的任何其他定义)。
根据一些消息来源,x86 系统注意到它被视为 16 位:
在 x86 PC(Intel、AMD 等)中,虽然架构很早就支持 32 位和 64 位寄存器,但其本机字大小可以追溯到 16 位起源,“单个”字为 16 位。“双”字是 32 位。请参阅 32 位计算机和 64 位计算机。
然而英特尔的官方文档(sdm 第 2 卷,第 1.3.1 节)指出:
这意味着字的字节从最低有效字节开始编号。图 1-1 说明了这些约定。
图 1-1 显示了 x86-64 上下文中单词的小端序列中的 4 个字节,而不是 2 个字节或 8 个字节(如上面链接的来源的不同定义所建议的那样):
我对这一切真正感到困惑的是如何获取和解析指令。我正在编写一个模拟器,一旦我解析 PE 格式的可执行文件并进入文本部分,如果我要遵循 4 字节小端格式,这是否意味着将首先解析第 4 个字节?
让我们组成一些字节,例如:
.text segment buffer:
< 0x10, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20 > ....
Run Code Online (Sandbox Code Playgroud)
我会将第一条指令解析为 1C、1B、1A、10、20、1F、1E、1D ...(等等,由于长度可变,显然可能有更多的单词需要读取,具体取决于这里的实际字节是什么)?
哪个逻辑处理器属于 P 核心组,哪个属于 E 核心组?
我的第一个想法是检查每个逻辑处理器的基本时钟,然后假设最低的基本时钟属于 E 核(根据英特尔规范,E 核的基本时钟总是明显低于 P 核)。
我希望HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor在注册表中进行检查就足够了。不幸的~MHz是始终包含 P 核的基本时钟。
我一直在EnterCriticalSection对 Windows 10 上的函数进行逆向工程,发现了这个有趣的自旋循环:
它是这样的:
lbl_loop:
mov ecx, [rsp+60h]
mov ecx, [rsp+60h]
mov ecx, [rsp+60h]
pause
mov ecx, [rsp+60h]
inc ecx
mov [rsp+60h], ecx
cmp ecx, eax
jb lbl_loop
Run Code Online (Sandbox Code Playgroud)
[rsp+60h]所以我的问题是 -循环读取 4 次然后写回的目的是什么?
为什么他们不能这样做:
lbl_loop:
pause
inc ecx
cmp ecx, eax
jb lbl_loop
mov [rsp+60h], ecx
Run Code Online (Sandbox Code Playgroud)
附言。请注意,这是 Windows 10 的生产版本。其余功能EnterCriticalSection均已优化。所以这不是调试版本。
intel ×10
x86 ×4
c ×2
opencl ×2
x86-64 ×2
assembly ×1
avx ×1
boot ×1
cmake ×1
cpu ×1
cpu-cache ×1
cpu-cores ×1
cpu-word ×1
cpuid ×1
endianness ×1
energy ×1
hardware ×1
intel-mic ×1
machine-code ×1
msr ×1
multicore ×1
osdev ×1
performance ×1
prefetch ×1
processor ×1
simd ×1
spinlock ×1
sse ×1
winapi ×1
windows ×1