Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的CPU速度和线程+; 我有以下C++程序: void testSpeed(int start, int end) { int temp = 0; for(int i = start; i < end; i++) { temp++; } } int main() { using namespace boost; timer aTimer; // start two new threads that calls the "testSpeed" function boost::thread my_thread1(&testSpeed, 0, 500000000); boost::thread my_thread2(&testSpeed, 500000000, 1000000000); // wait for both threads to finish my_thread1.join(); my_thread2.join(); double elapsedSec = aTimer.elapsed(); double IOPS = 1/elapsedSec; } void测试速度(int开始,int结束) { 内部温度=0; for(int i=start;i?你如何精确地测试更多线程?(这里有很多微妙的问题,我们需要看到真正的代码)。它现在运行多长时间?您比较过单线程和双线程运行时吗?请修复代码,使其能够编译。编译器可能会注意到testSpeed没有副作用,并对其进行优化以立即返回。请尝试volatile int temp强制它更新指定的次数(并检查程序集以确保它正在执行您认为应该执行的操作)。抱歉,伙计们,我删除了numItr。当前代码显示了两个线程,但我也可以删除第二个线程,并让第一个线程在整个空间(0到10亿)上运行。谢谢!很有趣。您所说的“编译器优化了您的循环”是什么意思?@user247866它发现循环计数器是一个常数,并执行了一些糟糕的分析。如果运气不好,你只需将temp设置为end。优化编译器可以检测到你的函数testSpeed()没有副作用。因为您只修改局部变量而从不引用它,所以编译器可以查看它并查看testSpeed()没有副作用,并且可以有效地被无操作取代,而不会改变程序的语义。这是测试这样的微基准测试的一个基本危险-您可能无法测量您认为正在测量的内容。我想您还应该提到volatile,就像一个操作注释者所做的那样。@user247866查看我的answer.它将更详细地介绍这种类型的优化。_C++_Concurrency - Fatal编程技术网

C+中的CPU速度和线程+; 我有以下C++程序: void testSpeed(int start, int end) { int temp = 0; for(int i = start; i < end; i++) { temp++; } } int main() { using namespace boost; timer aTimer; // start two new threads that calls the "testSpeed" function boost::thread my_thread1(&testSpeed, 0, 500000000); boost::thread my_thread2(&testSpeed, 500000000, 1000000000); // wait for both threads to finish my_thread1.join(); my_thread2.join(); double elapsedSec = aTimer.elapsed(); double IOPS = 1/elapsedSec; } void测试速度(int开始,int结束) { 内部温度=0; for(int i=start;i?你如何精确地测试更多线程?(这里有很多微妙的问题,我们需要看到真正的代码)。它现在运行多长时间?您比较过单线程和双线程运行时吗?请修复代码,使其能够编译。编译器可能会注意到testSpeed没有副作用,并对其进行优化以立即返回。请尝试volatile int temp强制它更新指定的次数(并检查程序集以确保它正在执行您认为应该执行的操作)。抱歉,伙计们,我删除了numItr。当前代码显示了两个线程,但我也可以删除第二个线程,并让第一个线程在整个空间(0到10亿)上运行。谢谢!很有趣。您所说的“编译器优化了您的循环”是什么意思?@user247866它发现循环计数器是一个常数,并执行了一些糟糕的分析。如果运气不好,你只需将temp设置为end。优化编译器可以检测到你的函数testSpeed()没有副作用。因为您只修改局部变量而从不引用它,所以编译器可以查看它并查看testSpeed()没有副作用,并且可以有效地被无操作取代,而不会改变程序的语义。这是测试这样的微基准测试的一个基本危险-您可能无法测量您认为正在测量的内容。我想您还应该提到volatile,就像一个操作注释者所做的那样。@user247866查看我的answer.它将更详细地介绍这种类型的优化。

C+中的CPU速度和线程+; 我有以下C++程序: void testSpeed(int start, int end) { int temp = 0; for(int i = start; i < end; i++) { temp++; } } int main() { using namespace boost; timer aTimer; // start two new threads that calls the "testSpeed" function boost::thread my_thread1(&testSpeed, 0, 500000000); boost::thread my_thread2(&testSpeed, 500000000, 1000000000); // wait for both threads to finish my_thread1.join(); my_thread2.join(); double elapsedSec = aTimer.elapsed(); double IOPS = 1/elapsedSec; } void测试速度(int开始,int结束) { 内部温度=0; for(int i=start;i?你如何精确地测试更多线程?(这里有很多微妙的问题,我们需要看到真正的代码)。它现在运行多长时间?您比较过单线程和双线程运行时吗?请修复代码,使其能够编译。编译器可能会注意到testSpeed没有副作用,并对其进行优化以立即返回。请尝试volatile int temp强制它更新指定的次数(并检查程序集以确保它正在执行您认为应该执行的操作)。抱歉,伙计们,我删除了numItr。当前代码显示了两个线程,但我也可以删除第二个线程,并让第一个线程在整个空间(0到10亿)上运行。谢谢!很有趣。您所说的“编译器优化了您的循环”是什么意思?@user247866它发现循环计数器是一个常数,并执行了一些糟糕的分析。如果运气不好,你只需将temp设置为end。优化编译器可以检测到你的函数testSpeed()没有副作用。因为您只修改局部变量而从不引用它,所以编译器可以查看它并查看testSpeed()没有副作用,并且可以有效地被无操作取代,而不会改变程序的语义。这是测试这样的微基准测试的一个基本危险-您可能无法测量您认为正在测量的内容。我想您还应该提到volatile,就像一个操作注释者所做的那样。@user247866查看我的answer.它将更详细地介绍这种类型的优化。,c++,concurrency,C++,Concurrency,因此,我们的想法是用每秒整数运算(IOPS)来测试CPU速度。 有10亿次迭代(运算),所以在1Ghz的CPU上,我相信每秒应该有10亿次整数运算 我的假设是,更多线程=每秒执行更多整数操作。但是我尝试的线程越多,每秒看到的操作就越少(我的内核比线程多)。 是什么导致了这种行为?是头顶上的线吗?也许我应该尝试一个更长的实验,看看线程是否真的有用 谢谢大家! 更新: 所以我将循环更改为运行180亿次,并将temp声明为volatile。还添加了另一个名称不同的testSpeed方法,因此现在一个单

因此,我们的想法是用每秒整数运算(IOPS)来测试CPU速度。 有10亿次迭代(运算),所以在1Ghz的CPU上,我相信每秒应该有10亿次整数运算

我的假设是,更多线程=每秒执行更多整数操作。但是我尝试的线程越多,每秒看到的操作就越少(我的内核比线程多)。 是什么导致了这种行为?是头顶上的线吗?也许我应该尝试一个更长的实验,看看线程是否真的有用

谢谢大家!

更新
所以我将循环更改为运行180亿次,并将temp声明为volatile。还添加了另一个名称不同的testSpeed方法,因此现在一个单线程一个接一个地执行这两个方法,而两个线程分别执行一个方法;所以不应该有任何同步的问题,等等。。。行为仍然没有改变!根据计时器,单线程速度更快。啊!我找到了那个笨蛋,显然计时器在虚张声势。这两个线程需要一半的时间来完成,但计时器告诉我单线程运行快了两秒。我现在想知道为什么。。。谢谢大家

我几乎可以肯定,编译器优化了您的循环。由于您没有减去创建/同步线程的开销,因此实际上您只测量了这一开销。因此,线程越多,创建的开销就越大,所需时间也就越多


总的来说,您可以参考您的CPU文档,了解它的频率以及任何给定指令需要多少滴答声。用这样的方法自己测试它几乎是不可能的,而且毫无用处。这是因为诸如上下文切换、将执行从一个CPU/核心转移到另一个CPU/核心、调度程序交换、分支错误预测等开销。在现实生活中,您还将遇到缓存未命中和大量内存总线延迟,因为没有适合约15个寄存器的程序。所以你最好用一些好的分析器来测试一个真正的程序。例如,最新的CPU可以提供CPU暂停信息、缓存未命中、分支预测失误等。您可以使用一个好的探查器来实际决定何时以及如何并行您的程序。

随着线程数量的增加超过某一点,它会导致缓存未命中的数量增加(缓存在线程之间共享),但同时内存访问延迟被大量线程掩盖(当一个线程正在等待从内存中提取数据时,其他线程正在运行)。因此有一个折衷。这是一篇关于这个主题的非常有趣的论文

根据本文,在多核机器上,当线程数非常少(核数的数量级)时,性能会随着线程数的增加而提高,因为现在核被充分利用

之后,线程数量的进一步增加会导致缓存未命中占主导地位,从而导致性能下降

如果线程数量变得非常大,以至于每个线程的缓存存储量几乎为零,则所有内存访问都是从主内存进行的。但同时,线程数量的增加也非常有效地掩盖了内存访问延迟的增加。这一次,第二个效应占主导地位,导致内存访问延迟增加表演轻松


因此,中间的山谷是性能最差的区域。

什么是<代码> NoUMTR < /代码>?你如何精确地测试更多线程?(这里有很多微妙的问题,我们需要看到真正的代码)。它现在运行多长时间?您比较过单线程和双线程运行时吗?请修复代码,使其能够编译。编译器可能会注意到
testSpeed
没有副作用,并对其进行优化以立即返回。请尝试
volatile int temp
强制它更新指定的次数(并检查程序集以确保它正在执行您认为应该执行的操作)。抱歉,伙计们,我删除了numItr。当前代码显示了两个线程,但我也可以删除第二个线程,并让第一个线程在整个空间(0到10亿)上运行。谢谢!很有趣。您所说的“编译器优化了您的循环”是什么意思?@user247866它发现循环计数器是一个常数,并执行了一些糟糕的分析。如果运气不好,你只需将
temp
设置为
end
。优化编译器可以检测到你的函数testSpeed()没有副作用。因为您只修改局部变量而从不引用它,所以编译器可以查看它并查看testSpeed()没有副作用,并且可以有效地被无操作取代,而不会改变程序的语义。这是测试这样的微基准测试的一个基本危险-您可能无法测量您认为正在测量的内容。我想您还应该提到
volatile
,就像一个操作注释者所做的那样。@user247866查看我的answer.它将更详细地介绍这种类型的优化。