使用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