查询 time/cycles 是针对所有 cores/threads 的序列化请求还是并行请求?
Is querying time/cycles a serialized or a parallel request for all cores/threads?
假设有一个简单的 "which thread finishes loop first" 基准,
#include<thread>
#include<iostream>
#include<mutex>
int main()
{
std::mutex m;
std::thread t1([&](){
auto c1=clock();
for(int i=0;i<1000000;i++){ /* some unremovable logic here */ }
auto c2=clock();
std::lock_guard<std::mutex> g(m);
std::cout<<"t1: "<<c2-c1<<" "<<std::endl;
});
std::thread t2([&](){
auto c1=clock();
for(int i=0;i<1000000;i++){ /* some unremovable logic here */ }
auto c2=clock();
std::lock_guard<std::mutex> g(m);
std::cout<<"t2: "<<c2-c1<<" "<<std::endl;
});
t1.join();
t2.join();
return 0;
}
我们能否相信 clock()
或任何其他 time/clock 请求函数不会在线程之间序列化并始终独立,以便测量它不会改变线程完成工作的顺序?
如果整个 CPU 有单个时钟周期计数器,C++ 如何对每个线程进行计数?如果多个线程同时查询它是否只是广播相同的数据?还是将后面的微操作中的操作序列化,一次服务一个线程?
以上代码编译并给出了这个结果(if(t1.joinable())
和 if(t2.joinable())
):
t1: 2
t2: 3
这是否意味着线程 1 绝对首先完成,或者它实际上是在稍后完成但首先为其请求了时钟,因此线程 2 出现了滞后?
不检查它们是否可加入:
t1: 1
t2: 1
std::chrono::system_clock
标准:
23.17.7.1 Class system_clock [time.clock.system]
Objects of class system_clock represent wall clock time from the
system-wide realtime clock.
系统范围的实时时钟,意味着所有进程检索相同的时间点。并且调用不应导致阻塞。
假设有一个简单的 "which thread finishes loop first" 基准,
#include<thread>
#include<iostream>
#include<mutex>
int main()
{
std::mutex m;
std::thread t1([&](){
auto c1=clock();
for(int i=0;i<1000000;i++){ /* some unremovable logic here */ }
auto c2=clock();
std::lock_guard<std::mutex> g(m);
std::cout<<"t1: "<<c2-c1<<" "<<std::endl;
});
std::thread t2([&](){
auto c1=clock();
for(int i=0;i<1000000;i++){ /* some unremovable logic here */ }
auto c2=clock();
std::lock_guard<std::mutex> g(m);
std::cout<<"t2: "<<c2-c1<<" "<<std::endl;
});
t1.join();
t2.join();
return 0;
}
我们能否相信 clock()
或任何其他 time/clock 请求函数不会在线程之间序列化并始终独立,以便测量它不会改变线程完成工作的顺序?
如果整个 CPU 有单个时钟周期计数器,C++ 如何对每个线程进行计数?如果多个线程同时查询它是否只是广播相同的数据?还是将后面的微操作中的操作序列化,一次服务一个线程?
以上代码编译并给出了这个结果(if(t1.joinable())
和 if(t2.joinable())
):
t1: 2
t2: 3
这是否意味着线程 1 绝对首先完成,或者它实际上是在稍后完成但首先为其请求了时钟,因此线程 2 出现了滞后?
不检查它们是否可加入:
t1: 1
t2: 1
std::chrono::system_clock
标准:
23.17.7.1 Class system_clock [time.clock.system]
Objects of class system_clock represent wall clock time from the system-wide realtime clock.
系统范围的实时时钟,意味着所有进程检索相同的时间点。并且调用不应导致阻塞。