多线程编程速度较慢
Program slower with multi-threads
我开始学习多线程编程,并且有程序。我的程序使用多线程时速度较慢:
多线程:~ 8.5 秒
没有多线程:~ 4.96
有人可以解释我的代码有什么问题吗?
#include <iostream>
#include <thread>
#include <ctime>
using namespace std;
long long even_sum = 0;
long long odd_sum = 0;
void findEvenNumber(int start, int end){
for(int i=start;i<end;i++){
if(i%2==0){
even_sum++;
}
}
}
void findOddNumber(int start, int end){
for(int i=start;i<end;i++){
if(i%2==1){
odd_sum++;
}
}
}
void multiTask(){
thread t1(findEvenNumber,1,1000000000);
thread t2(findOddNumber,1,1000000000);
t1.join();
t2.join();
}
void noMultiTask(){
findEvenNumber(1,1000000000);
findOddNumber(1,1000000000);
}
int main(){
clock_t start = clock();
//noMultiTask();
//multiTask();
clock_t end = clock();
cout<<(double)(end - start)/CLOCKS_PER_SEC<<endl;
cout<<even_sum<<" "<<odd_sum<<endl;
return 0;
}
multi-threaded 版本必须启动线程并等待它们完成。非 multi-threaded 版本没有。因此,multi-threaded 版本需要更多 CPU 时间是有道理的。
multi-threaded 版本确实花费更少的时间。
至少,你有一个错误的共享问题。 even_count
和 odd_count
几乎肯定在同一个缓存行上,这意味着当您想要访问一个变量时,您实际上是在强制另一个线程使其缓存行无效。虚假分享的内容远不止于此,但为了快速概览,Scott Meyers 的精彩演讲一开始就提到了这一点:https://www.youtube.com/watch?v=WDIkqP4JbkE
通过使用局部变量进行 odd/even 计数并仅在线程末尾更新全局变量,我的系统性能得到了更好的提升(1.23299 秒对 1.07338 秒)。
void findEvenNumber(int start, int end){
auto count = 0;
for(int i=start;i<end;i++){
if(i%2==0){
count++;
}
}
even_sum += count;
}
void findOddNumber(int start, int end){
auto count = 0;
for(int i=start;i<end;i++){
if(i%2==1){
count++;
}
}
odd_sum += count;
我开始学习多线程编程,并且有程序。我的程序使用多线程时速度较慢: 多线程:~ 8.5 秒 没有多线程:~ 4.96 有人可以解释我的代码有什么问题吗?
#include <iostream>
#include <thread>
#include <ctime>
using namespace std;
long long even_sum = 0;
long long odd_sum = 0;
void findEvenNumber(int start, int end){
for(int i=start;i<end;i++){
if(i%2==0){
even_sum++;
}
}
}
void findOddNumber(int start, int end){
for(int i=start;i<end;i++){
if(i%2==1){
odd_sum++;
}
}
}
void multiTask(){
thread t1(findEvenNumber,1,1000000000);
thread t2(findOddNumber,1,1000000000);
t1.join();
t2.join();
}
void noMultiTask(){
findEvenNumber(1,1000000000);
findOddNumber(1,1000000000);
}
int main(){
clock_t start = clock();
//noMultiTask();
//multiTask();
clock_t end = clock();
cout<<(double)(end - start)/CLOCKS_PER_SEC<<endl;
cout<<even_sum<<" "<<odd_sum<<endl;
return 0;
}
multi-threaded 版本必须启动线程并等待它们完成。非 multi-threaded 版本没有。因此,multi-threaded 版本需要更多 CPU 时间是有道理的。
multi-threaded 版本确实花费更少的时间。
至少,你有一个错误的共享问题。 even_count
和 odd_count
几乎肯定在同一个缓存行上,这意味着当您想要访问一个变量时,您实际上是在强制另一个线程使其缓存行无效。虚假分享的内容远不止于此,但为了快速概览,Scott Meyers 的精彩演讲一开始就提到了这一点:https://www.youtube.com/watch?v=WDIkqP4JbkE
通过使用局部变量进行 odd/even 计数并仅在线程末尾更新全局变量,我的系统性能得到了更好的提升(1.23299 秒对 1.07338 秒)。
void findEvenNumber(int start, int end){
auto count = 0;
for(int i=start;i<end;i++){
if(i%2==0){
count++;
}
}
even_sum += count;
}
void findOddNumber(int start, int end){
auto count = 0;
for(int i=start;i<end;i++){
if(i%2==1){
count++;
}
}
odd_sum += count;