c++ - 线程(C++ 中的并行计算)是否与优化级别 (gcc) 不兼容?

标签 c++ multithreading gcc parallel-processing compiler-optimization

我正在尝试学习如何使用多线程,然后我编写了一个代码(见下文)。正如预期的那样,parallel 函数需要 2.6snon-parallel 需要 6.4s

然后我尝试使用 gcc 提供的优化 -O3 修改编译。这样一来,非并行函数用了0s,而并行函数用了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;
}

最佳答案

您的“非并行”函数 fS() 将值计算到不会去任何地方的局部变量中,其中 fs_N() 对其参数进行计算。因此,当启用优化的编译器消除了 fS() 的所有代码,因为它不会影响任何东西。您需要将该结果存储在某处(可能返回该函数并可能稍后打印出来):

double fS(void){
    double sum;
    int i;
    for(i=0;i<N;i++){
        sum += sin(i*0.1);
    }
//  cout << endl << sum << endl;    
    return sum;
}

关于c++ - 线程(C++ 中的并行计算)是否与优化级别 (gcc) 不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31975249/

相关文章:

c - 如何验证目标文件是由 g++ 而不是 gcc 生成的

c++ - NetBeans C++ 中是否有 "just my code"功能?

c# - 在单独的线程中显示主窗体上的另一个窗体

c - 使用 gcc 在 C 中有多个 __attribute__

C - 如何使用 sscanf <int><string><int> 进行读取?

python - 多线程时 cv2 图像显示不起作用

c++ - 检查堆栈中的局部变量

c++ - 在 C++ 中没有匹配函数调用 'game_rule'

c++ - 逆时针定向多边形线所需的编码算法

c++ - 如何正确使用互斥量作为线程中成员函数的参数?