首页 > 试题广场 >

使用OpenMP或者Pthread对下面这段计算各行的积的累

[问答题]
使用OpenMP或者Pthread对下面这段计算各行的积的累加的代码进行多线程优化。
int sum = 0;
for (int i = 0; i < m; ++i) {
    int temp = 1;
    for (int j = 0; j < i; ++j) {
        temp *= a[i * m + j];
    }
    sum += temp;
}

答题说明:该题为手动判卷,答案只要写对即可,不用严格满足字符比对。
题中的代码似乎有点问题,按照我的理解,我把题中所给的代码转换成下面的形式:
void test_no_optimize_new_coder()
{
    const int N = 1e9;
    int *nums = new int[N];
    for(int i = 0; i < N; i++)
    {
        nums[i] = 1;
    }
    int sum = 0;
    int m = 1e7;

    for(int i = 0; i < N/m ; i++)
    {
        int temp = 1;
        for(int j = 0; j < m; j++)
        {
            temp *= nums[i * m + j];
        }
        sum += temp;
    }
    std::cout << "*************非优化方案*************\n";
    std::cout << "sum = " << sum << std::endl;
    delete nums;
}
下面要做的就是使用OPENMP优化上述代码,方法就是为每个线程拷贝一份temp变量,退出并行块时再把各个线程的temp变量乘,OPENMP正好提供了一个操作
#pragma omp parallel for reduction
所以,代码优化如下
void test_optimize_new_coder_use_reduction()
{
    const int N = 1e9;
    int *nums = new int[N];
    for(int i = 0; i < N; i++)
    {
        nums[i] = 1;
    }
    int sum = 0;
    int m = 1e7;
    
    omp_set_num_threads(4);
    for(int i = 0; i < N/m ; i++)
    {
        int temp = 1;
      
        #pragma omp parallel for reduction(*:temp)
        for(int j = 0; j < m; j++)
        {
            temp *= nums[i * m + j];
        }
        sum += temp;
    }
    std::cout << "*************优化方案(使用reduction)*************\n";
    std::cout << "sum = " << sum << std::endl;
    delete nums;
}
结果:加速比为1.5




发表于 2021-06-02 11:32:09 回复(0)