- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很困惑 rdtscp
在多核环境中单调递增。根据文档:__rdtscp , rdtscp
似乎是基于处理器的指令,可以防止围绕调用重新排序指令。
The processor monotonically increments the time-stamp counter MSR every clock cycle and resets it to 0 whenever the processor is reset.
rdtscp
肯定会在同一 CPU 内核上单调递增,但这是
rdtscp
时间戳保证跨不同 CPU 内核的单调性?我相信没有这种绝对的保证。例如,
Thread on CPU core#0 Thread on CPU core#1
unsigned int ui;
uint64_t t11 = __rdtscp(&ui);
uint64_t t12 = __rdtscp(&ui);
uint64_t t13 = __rdtscp(&ui);
unsigned int ui;
uint64_t t21 = __rdtscp(&ui);
uint64_t t22 = __rdtscp(&ui);
uint64_t t23 = __rdtscp(&ui);
以我的理解,我们可以有一个决定性的结论
t13 > t12 > t11
,但我们不能保证
t21 > t13
.
// file name: rdtscptest.cpp
// g++ rdtscptest.cpp -g -lpthread -Wall -O0 -o run
#include <chrono>
#include <thread>
#include <iostream>
#include <string>
#include <string.h>
#include <vector>
#include <x86intrin.h>
using namespace std;
void test(int tid) {
std::this_thread::sleep_for (std::chrono::seconds (tid));
unsigned int ui;
uint64_t tid_unique_ = __rdtscp(&ui);
std::cout << "tid: " << tid << ", counter: " << tid_unique_ << ", ui: " << ui << std::endl;
std::this_thread::sleep_for (std::chrono::seconds (1));
}
int main() {
size_t trd_cnt = 3 ;
std::vector<std::thread> threads(trd_cnt);
for (size_t i=0; i< trd_cnt; i++) {
// three threads with tid: 0, 1, 2
// force different threads to run on different cpu cores
threads[i] = std::thread(test, i);
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(i, &cpuset);
int rc = pthread_setaffinity_np(threads[i].native_handle(),
sizeof(cpu_set_t), &cpuset);
if (rc != 0) {
std::cout << "Error calling pthread_setaffinity_np, code: " << rc << "\n";
}
}
for (size_t i=0; i< trd_cnt; i++) {
threads[i].join() ;
}
return 0;
}
所以,这里有两个问题:
最佳答案
在大多数系统上是的,如果您在线程之间创建同步以确保一个线程确实在另一个线程之后运行。否则所有赌注都将取消;在另一个线程之前启动一个线程并不能确保其代码首先执行。
脚注 1:例如有一个旋转等待,直到它看到另一个完成的原子存储。或者使用互斥锁并运行 rdtscp
在临界区,还有一个变量来记录另一个线程是否已经存在。
在任何非古代(至少像 Core2 和更新版本)上,TSC 以恒定频率(“引用”)频率 滴答作响.见 this answer有关 constant_tsc
的链接和详细信息/nonstop_tsc
CPU 功能,以及 TSC 未同步的可能性。
大多数现代系统在实践中确实在内核之间同步了 TSC 我认为,感谢主板供应商确保即使在多插槽系统上,RESET 信号也能同时分配给所有内核。固件和操作系统软件小心不要搞砸。在单插槽系统上要容易得多,例如带有多核 CPU 的普通台式机,其中所有“额外”内核都在同一芯片上。
但这是不保证 ,以及部分原因 rdtscp
存在(带有处理器 ID 输出)是这种可能性(我认为当 RDTSCP 是新系统时,这在旧系统上可能更常见)。
VM 甚至可以使用 CPU 功能来透明地偏移和扩展 TSC(具有硬件支持),在物理机之间迁移 VM,同时保持 TSC 的单调性和频率。不加选择地使用这些功能当然会产生不同步的 TSC,甚至会产生在不同内核上以不同频率运行的 TSC。
TSC 是一个 64 位计数器,通常以 CPU 额定标签频率计数。在某些 CPU 上,这可能超过 ~4.2 GHz (2^32),因此在快速 CPU 上,高半部分每秒增加一次。 如果计算机已经“启动”超过 2^32 秒(几十年),或者如果 TSC 已被手动设置为具有较大偏移 ,则 TSC 理论上可以回绕。 .
关于c++ - RDTSCP 是否跨多核单调递增?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65975629/
人们在运行TwistedWeb服务器时使用哪些技术来利用多个处理器/内核?有推荐的方法吗? 我基于twisted.web的Web服务在Amazon EC2实例上运行,该实例通常具有多个CPU核心(8、
multicore 库中是否有类似 sapply 的东西?还是我必须 unlist(mclapply(..)) 才能实现这一点? 如果它不存在:推理是什么? 提前致谢,如果这是一个愚蠢的问题,我们深表
ZeroMQ 用于接收输入参数.. def server(): rep = context.socket(zmq.REP) rep.bind('tcp://*:{}'.format(P
我有一大组标量值分布在 3D 网格上(每个顶点一个值。) 我的目标是展示: 网格中值大于阈值的所有点。 并将连接的点分组(以简化显示。) 所以我的基本解决方案是: 找到通过阈值测试的点 对于每个没有被
作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功、JAVA底层、面试、职业成长相关资料等更多精彩文章在公众号「 小牛呼噜噜 」 。 大家好,我是呼噜噜,
有没有办法让 J 使用多个核心?我认为 APL/J 的部分好处是语言结构很适合并行解决方案。 查看我的 CPU 使用率(我在 OSX 上),显然只有一个处理器在使用。 我有一个很重的函数 f 作用在一
多核处理器如何处理中断。 我知道单核处理器如何处理中断。 我也知道不同类型的中断。 我想知道多核处理器如何处理硬件、程序、cpu时序和输入/输出中断 最佳答案 这应该被视为 other answer
很长一段时间以来,我一直将 LLVM 视为我目前正在实现的语言的新后端。它似乎具有良好的性能,相当高级的生成 API,足够的低级支持来优化奇特的优化。此外,虽然我自己没有检查过,但苹果似乎已经成功地演
我最近开始研究低级OS编程。我(非常缓慢)目前正在研究两本较旧的书,即XINU和Build Your Own 32 Bit OS,以及上一个问题How to get started in operat
我正在阅读对新英特尔凌动 330 的评论,他们指出任务管理器显示 4 个内核 - 两个物理内核,另外还有两个由超线程模拟。 假设您有一个包含两个线程的程序。还假设这些是在 PC 上执行任何工作的唯一线
我不知道如何在 C++ 中进行线程化,我不仅不想知道,而且有没有一种方法可以将线程强制到不同的核心上?另外,我如何才能知道用户拥有多少个内核? 最佳答案 将线程绑定(bind)到任意 CPU 称为设置
如果需要在多核处理器机器的多个内核上并行执行,Linux 内核是否会同时执行多个上下文切换?有引用吗? 最佳答案 是的,你是对的。在 SMP 系统上,多个上下文切换同时发生。每个核心都可以独立进行上下
与进程相比,线程更不可能从多核处理器中获益,这是真的吗?换句话说,内核会决定在单核而不是多核上执行线程吗? 我说的是属于同一进程的线程。 最佳答案 我不知道(各种)Linux 调度程序如何处理这个问题
我需要一些帮助来决定在单个 Solr 实例中创建单个索引还是在单个 Solr 实例中创建多个核心,每个核心为一个索引提供服务。 我的理解是,solr 中的单个索引通常用于索引一种类型的文档。当您有不同
NGINX 或 Apache 是否受益于具有以下任一项的服务器: 多核,或者 多个处理器? 如果是,为什么? 最佳答案 使用多个 CPU/CPU 内核使服务器应用程序有机会并行处理多个客户端连接(和请
我正在为我的爱好操作系统开发 CPU 检测和一般环境检测代码。是否存在需要多次调用 CPUID 的情况?也就是说如果系统有多个核心,操作系统是否需要在每个核心上调用CPUID? NUMA 也是如此。
我有一些关于多核 CPU 或多处理器系统中使用的高速缓存存储器的问题。 (虽然与编程没有直接关系,但当一个人为多核处理器/多处理器系统编写软件时,它会产生很多影响,因此在此询问!) 在多处理器系统或多
所以,我一直在使用 opencv 开发实时跟踪系统。几天前,我不得不开始使用 directshow(这对我来说是全新的),因为我需要网络摄像头的更高分辨率。分辨率越高,CPU 使用率就越高。仅使用没有
我经常听说其他语言被提升为更适合多核/并发编程,例如Clojure、Scala、Erlang 等,但我有点困惑为什么我需要担心多核问题,Java/.NET VM 不应该自动处理吗?如果没有,背后的原因
假设 x86 多核 PC 架构... 假设有 2 个内核(能够执行 2 个单独的指令流),并且 CPU 和 RAM 之间的接口(interface)是内存总线。 调度在 2 个不同内核上的 2 条指令
我是一名优秀的程序员,十分优秀!