问题标签 [hyperthreading]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
opencl - CPU/Intel OpenCL 性能问题、实现问题
我有几天悬而未决的问题没有答案。出现这些问题是因为我有相同问题的 OpenMP 和 OpenCL 实现。OpenCL 在 GPU 上完美运行,但在 CPU 上运行时性能降低 50%(与 OpenMP 实现相比)。一篇文章已经在处理 OpenMP 和 OpenCL 性能之间的差异,但它没有回答我的问题。目前我面临这些问题:
1)拥有“矢量化内核”(就英特尔离线编译器而言)真的那么重要吗?
有一个类似的帖子,但我认为我的问题更笼统。
据我了解:矢量化内核不一定意味着编译后的二进制文件中没有矢量/SIMD 指令。我检查了我的内核的汇编代码,并且有一堆 SIMD 指令。矢量化内核意味着通过使用 SIMD 指令,您可以在一个 CPU 线程中执行 4 个 (SSE) 或 8 个 (AVX) OpenCL“逻辑”线程。这只有在您的所有数据都连续存储在内存中时才能实现。但是谁拥有如此完美排序的数据呢?
所以我的问题是:从这个意义上说,让你的内核“矢量化”真的那么重要吗?
当然它可以提高性能,但是如果内核中的大多数计算密集型部分都是通过向量指令完成的,那么您可能会接近“最佳”性能。我认为我的问题的答案在于内存带宽。向量寄存器可能更适合高效的内存访问。在这种情况下,必须对内核参数(指针)进行矢量化。
2)如果我在CPU的本地内存中分配数据,它将分配到哪里?OpenCL 将 L1 缓存显示为本地内存,但它显然与 GPU 本地内存上的内存类型不同。如果它存储在 RAM/全局内存中,那么将数据复制到其中是没有意义的。如果它在缓存中,其他一些进程可能会将它刷新出来......所以这也没有意义。
3) “逻辑”OpenCL 线程如何映射到真正的 CPU 软件/硬件(Intel HTT)线程?因为如果我的内核运行时间很短,并且内核像在 TBB(线程构建块)或 OpenMP 中那样分叉,那么分叉开销将占主导地位。
4)线程分叉开销是多少?是否为每个“逻辑”OpenCL 线程派生了新的 CPU 线程,或者 CPU 线程是否被派生一次,然后再用于更多“逻辑”OpenCL 线程?
我希望我不是唯一对这些小东西感兴趣的人,你们中的一些人现在可能对这些问题有所了解。先感谢您!
更新
3) 目前,OpenCL 的开销比 OpenMP 更大,因此需要大量内核来实现高效的运行时执行。在 Intel OpenCL 中,工作组映射到 TBB 线程,因此 1 个虚拟 CPU 内核执行整个工作组(或线程块)。一个工作组是用 3 个嵌套的 for 循环实现的,如果可能的话,最里面的循环是矢量化的。所以你可以想象它是这样的:
如果最里面的循环可以被矢量化,它会使用 SIMD 步骤:
4) 每个 TBB 线程在 OpenCL 执行期间被分叉一次并被重用。每个 TBB 线程都绑定到一个虚拟内核,即。计算过程中没有线程迁移。
我也接受@natchouf-s 的回答。
linux - 确定用于构建 ATLAS 的独立 CPU(使用关联 ID 指定)
我正在尝试确定用于在具有 4 个 Intel CPU 和超线程(ubuntu 12.04)的 linux 机器上构建 ATLAS 的独立 CPU(用关联 ID 指定)。
我这样做的原因是 ATLAS 手册说在具有超线程的机器上只使用物理内核,关于如何实现这一点它说: “......如果你学习,你可以告诉 ATLAS 只使用真正的内核关于您的机器的一些信息。不幸的是,ATLAS 目前无法自动检测这些功能,但是如果您进行实验,您可以发现哪些亲和 ID 是单独的核心,......”
进一步提示如何实际进行此实验:“...在 Linux 下,我可以使用 cat /proc/cpuinfo... 发现这一点。”
在我的机器上,文件 /proc/cpuinfo 包含八个虚拟处理器的以下信息:
- 处理器:0
- vendor_id : 正版英特尔
- CPU系列:6
- 型号:42
- 型号名称:Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
- 步进:7
- 微码:0x1b
- 中央处理器兆赫:3392.333
- 缓存大小:8192 KB
- 物理ID:0
- 兄弟姐妹:8
- 核心编号:0
...
处理器 0 和 4 共享相同的核心 ID(处理器 1 和 5、2 和 6、3 和 7 以此类推)。但是,如果我将 --force-tids="4 0 1 2 3" 指定给 ATLAS 配置脚本,则构建失败(首先对我来说是由于 make pcheck 失败而引起的)。如果我不使用此标志,则 pcheck 可以正常工作,如下所示:http: //sourceforge.net/tracker/ ?func=detail&aid=3577908&group_id=23725&atid=379483 。
有人知道我如何通过一些实验来了解我的机器吗?
cpu - 在线禁用超线程
我有一个具有以下属性的 Ubuntu 服务器(快照)
处理器:23 vendor_id:GenuineIntel cpu 系列:6 型号:44 型号名称:Intel(R) Xeon(R) CPU X5690 @ 3.47GHz 步进:2 cpu MHz:1600.000 缓存大小:12288 KB 物理 id:1 个兄弟姐妹:12 核 id : 10 个 CPU 核心 : 6
对于被测系统,启用了超线程。我想禁用此系统的超线程。我不想启动并进入 BIOS 这样做,但想在线完成。我遇到的几个建议是执行以下操作:
'echo 0 >/sys/devices/system/node/node0/cpu2/online'
我不确定我应该去哪个 CPU 或节点并根据系统中的 CPU 内核、兄弟姐妹的数量执行以下操作。
任何的想法?
multithreading - 黑白超线程和多线程的区别?
我想知道是否有人可以向我解释这两者的区别?它与英特尔硬件架构(HT)有关吗?
c# - 如何从 .Net 中的超线程中获得最大收益
不确定这在托管语言中是否可行,但是否有可能在超线程存在的情况下真正使应用程序性能更好?
代码中有什么具体可以做的吗?,也许某些功能在 HT 环境中比其他功能运行得更好?
我知道要从多线程中受益,只需要生成新线程来执行繁重的 cpu 任务,但我不确定 HT 需要什么?
openmp - CPU时间与超线程相关吗?
增加的 CPU 时间(如time
CLI 命令所报告的)是否表明使用超线程时效率低下(例如花费在自旋锁或缓存未命中的时间),或者 CPU 时间是否可能因 HT 的奇怪性质而膨胀?(例如,真正的核心很忙,HT 无法启动)
我有四核 i7,我正在测试OpenMP 程序的可并行化部分(图像到调色板的重新映射) ——没有锁,没有关键部分。所有线程都访问一些只读共享内存(查找表),但只写入自己的内存。
我担心当核心数量超过 1 或 2 时,使用的 CPU 时间量会迅速增加。
我想在理想情况下,CPU 时间不会增加太多(相同数量的工作只是分布在多个内核上)。
这是否意味着有 40% 的开销用于并行化程序?
c# - 是否有非常适合在具有超线程的处理器上进行浮点计算的任务调度程序?
我想使用 TPL 来管理对英特尔 IPP 或 MKL 库的调用。自然,这些是浮点计算密集型指令。由于超线程只为每个内核分配一个浮点线程,我想要一种智能地安排任务的方法。
android - 处理器数量可靠性
我在做一款安卓游戏,单核手机如 Galaxy S 和双核 Galaxy S2 的性能差距堪比白天和黑夜。因此,我没有为单核和双/四核制作不同的版本,而是考虑使用设备的处理器数量来关闭和打开某些图形功能。
但是获得处理器数量的可靠性如何?一些单核手机是否具有像英特尔超线程这样的线程,将一个核心显示为两个?还是有些双核手机比 Galaxy S2 慢很多?
performance - 矩阵乘法中的超线程和涡轮增压 - 使用超线程时性能更差
我正在调整我的 GEMM 代码并与 Eigen 和 MKL 进行比较。我有一个具有四个物理核心的系统。到目前为止,我一直使用 OpenMP 的默认线程数(我的系统上为 8 个)。我认为这至少与四个线程一样好。但是,我今天发现,如果我在一个大型密集矩阵 (1000x1000) 上运行 Eigen 和我自己的 GEMM 代码,我使用四个线程而不是八个线程可以获得更好的性能。效率从 45% 跃升至 65%。我认为这也可以在这个情节中看到 https://plafrim.bordeaux.inria.fr/doku.php?id=people:guenneba
差异是相当大的。但是,性能不太稳定。使用 Eigen 和我自己的 GEMM 代码,每次迭代的性能都会有所提高。我很惊讶超线程使性能变得如此糟糕。我想这不是一个问题。这是一个意想不到的观察结果,我希望能得到反馈。
我看到这里也建议不使用超线程。
如何加快 Eigen 库的矩阵乘积?
我确实有一个关于测量最大性能的问题。我现在要做的是运行 CPUz 并在运行 GEMM 代码时查看频率,然后在我的代码中使用该数字(在我使用的一个超频系统上为 4.3 GHz)。我可以相信所有线程的这个数字吗?我如何知道每个线程的频率以确定最大值?如何正确计算涡轮增压?
cpu - 检测没有 CPUID 的超线程?
我正在开发一个数字运算应用程序,并且我正在尝试尽可能地从中挤出所有可能的性能。我将它设计为适用于 Windows 和 *nix,甚至适用于多 CPU 机器。
我目前设置的方式,它询问操作系统有多少内核,将每个内核上的关联设置为运行 CPUID ASM 命令的函数(是的,它会在同一个 CPU 上运行多次;没什么大不了的,它只是初始化代码)并在 CPUID 的 Features 请求中检查超线程。根据对 CPUID 命令的响应,它计算应该运行多少线程。当然,如果一个核心/CPU 支持超线程,它将在一个核心上生成两个。
但是,我用自己的机器遇到了一个分支案例。我运行带有 Core 2 Duo 的 HP 笔记本电脑。不久前,我用支持超线程的更好的 Core 2 Duo 替换了工厂处理器。但是,BIOS 不支持它,因为工厂处理器不支持。因此,即使 CPU 报告它具有超线程,它也无法使用它。
我知道在 Windows 中,您可以通过简单地计算逻辑内核来检测超线程(因为每个启用超线程的物理内核都分为两个逻辑内核)。但是,我不确定 *nix(尤其是 Linux;我的测试平台)中是否有这样的东西。
如果在双核处理器上启用了 HyperTreading,Linux 函数 sysconf(_SC_NPROCESSORS_CONF) 会显示有四个处理器还是只有两个?
如果我可以在两个系统上获得可靠的计数,那么我可以简单地跳过基于 CPUID 的超线程检查(毕竟,它有可能在 BIOS 中被禁用/不可用)并使用操作系统报告的内容,但不幸的是因为我的分支案例我无法确定这一点。
PS:在代码的 Windows 部分中,我正在解析 GetLogicalProcessorInformation() 的返回
加分点:有人知道如何修改 BIOS,这样我就可以真正超线程我的 CPU ;)?主板是带有 AMD M96 芯片组的 HP 578129-001(恶心)。