线程(C++ 中的并行计算)是否与优化级别 (gcc) 不兼容?
Is thread (parallel computing in c++) incompatible with optimization levels (gcc)?
我正在尝试学习如何使用多线程,然后我编写了一个代码(见下文)。正如预期的那样,parallel 函数需要 2.6s 而 non-parallel 需要 6.4 s.
然后我尝试使用 gcc 提供的优化 -O3 修改编译。 非并行 函数花费了 0s 而 parallel 花费了 2s !显示-O3没有作用于并联函数。
为什么优化级别不适用于线程??有什么根本性的问题吗?我是不是做错了什么?
代码如下:
#include <iostream>
#include <ctime>
#include <cmath>
#include <vector>
#include <thread>
using namespace std;
#define N 1E8
#define num_sum std::thread::hardware_concurrency()
void fS(void){
double sum;
int i;
for(i=0;i<N;i++){
sum += sin(i*0.1);
}
// cout << endl << sum << endl;
return;
}
void fS_N(vector<double>& sum,int j){
int i;
int imin,imax,intervalo;
intervalo = N/num_sum;
imin = j*intervalo;
imax = (j+1)*intervalo;
for(i=imin;i<imax;i++){
sum[j] += sin(i*0.1);
}
return;
}
int main(){
clock_t t;
cout << "# disponiveis de nos/cpu: " << num_sum << endl;
//no parallel
t = clock();
fS();
t = clock()-t;
cout << "\n Time (no parallel):";
cout << ((double)t)/CLOCKS_PER_SEC << endl;
//parallel
t = clock();
vector<thread> allsum;
vector<double> Svalue(num_sum,0.);
int j;
for(j = 0; j<num_sum; j++){
allsum.push_back(thread (fS_N, ref(Svalue),j) );
}
for(auto &t : allsum){
t.join();
}
double Soma=0.;
for (j=0;j<num_sum;j++){
Soma += Svalue[j];
}
// cout << Soma << endl;
t = clock()-t;
cout << "\n Time (parallel):";
cout << ((double)t)/CLOCKS_PER_SEC << endl;
return 0;
}
您的 "no parallel" 函数 fS()
将值计算到不会去任何地方的局部变量中,其中 fs_N()
对其参数进行计算。因此,当启用优化的编译器消除了 fS()
的所有代码,因为它不会影响任何东西。您需要将该结果存储在某处(对于该函数可能 return 并可能稍后将其打印出来):
double fS(void){
double sum;
int i;
for(i=0;i<N;i++){
sum += sin(i*0.1);
}
// cout << endl << sum << endl;
return sum;
}
我正在尝试学习如何使用多线程,然后我编写了一个代码(见下文)。正如预期的那样,parallel 函数需要 2.6s 而 non-parallel 需要 6.4 s.
然后我尝试使用 gcc 提供的优化 -O3 修改编译。 非并行 函数花费了 0s 而 parallel 花费了 2s !显示-O3没有作用于并联函数。
为什么优化级别不适用于线程??有什么根本性的问题吗?我是不是做错了什么?
代码如下:
#include <iostream>
#include <ctime>
#include <cmath>
#include <vector>
#include <thread>
using namespace std;
#define N 1E8
#define num_sum std::thread::hardware_concurrency()
void fS(void){
double sum;
int i;
for(i=0;i<N;i++){
sum += sin(i*0.1);
}
// cout << endl << sum << endl;
return;
}
void fS_N(vector<double>& sum,int j){
int i;
int imin,imax,intervalo;
intervalo = N/num_sum;
imin = j*intervalo;
imax = (j+1)*intervalo;
for(i=imin;i<imax;i++){
sum[j] += sin(i*0.1);
}
return;
}
int main(){
clock_t t;
cout << "# disponiveis de nos/cpu: " << num_sum << endl;
//no parallel
t = clock();
fS();
t = clock()-t;
cout << "\n Time (no parallel):";
cout << ((double)t)/CLOCKS_PER_SEC << endl;
//parallel
t = clock();
vector<thread> allsum;
vector<double> Svalue(num_sum,0.);
int j;
for(j = 0; j<num_sum; j++){
allsum.push_back(thread (fS_N, ref(Svalue),j) );
}
for(auto &t : allsum){
t.join();
}
double Soma=0.;
for (j=0;j<num_sum;j++){
Soma += Svalue[j];
}
// cout << Soma << endl;
t = clock()-t;
cout << "\n Time (parallel):";
cout << ((double)t)/CLOCKS_PER_SEC << endl;
return 0;
}
您的 "no parallel" 函数 fS()
将值计算到不会去任何地方的局部变量中,其中 fs_N()
对其参数进行计算。因此,当启用优化的编译器消除了 fS()
的所有代码,因为它不会影响任何东西。您需要将该结果存储在某处(对于该函数可能 return 并可能稍后将其打印出来):
double fS(void){
double sum;
int i;
for(i=0;i<N;i++){
sum += sin(i*0.1);
}
// cout << endl << sum << endl;
return sum;
}