【发布时间】:2017-08-14 06:44:46
【问题描述】:
我是一名新的 OpenMp 程序员,现在我遇到了将两个矩阵相乘的问题。这是我的并行代码,但没有我预期的那么快。 例如,我给它一个 3000 * 3000 矩阵和 3000 * 3000 并且我的 Domain 是 2(随机数是 0 或 1 )并且并行比顺序慢
clock_t tStart = clock();
cout<<(char)169<<" parallel "<<(char)170<<endl;
int a,b,c,Domain ;
cin>>a>>b>>c>>Domain;
srand(time(0));
int **arr1;
int **arr2;
int **arrRet;
arr1 = new int*[a];
#pragma omp for schedule (dynamic)
for(int i=0 ; i<a ; i++)
arr1[i] = new int [b];
arr2 = new int*[b];
#pragma omp for schedule (dynamic)
for(int i=0 ; i<b ; i++)
arr2[i] = new int [c];
arrRet = new int*[a];
#pragma omp for schedule (dynamic)
for(int i=0 ; i<a ; i++)
arrRet[i] = new int [c];
#pragma omp for schedule (dynamic)
for(int i=0 ; i<a ; i++)
{
#pragma omp for schedule (dynamic)
for(int j=0; j<b ; j++)
{
arr1[i][j]=rand()%Domain;
}
}
//cout<<"\n\n\n";
#pragma omp for schedule (dynamic)
for(int i=0 ; i<b ; i++)
{
#pragma omp for schedule (dynamic)
for(int j=0 ; j<c ; j++)
{
arr2[i][j]=rand()%Domain;
}
}
//cout<<"\n\n\n";
#pragma omp for schedule (dynamic)
for(int i=0 ; i<a ; i++)
#pragma omp for schedule (dynamic)
for(int j2=0 ; j2<c ; j2++)
{
int sum=0;
#pragma omp parallel for shared(sum) reduction(+:sum)
for(int j=0 ; j<b ; j++)
{
sum+=arr1[i][j]*arr2[j][j2];
}
arrRet[i][j2]=sum;
}
printf("Time taken : %.4fs\n", (double)(clock() - tStart) / CLOCKS_PER_SEC);
【问题讨论】:
-
@TheQuantumPhysicist 我的老师告诉我我不能使用图书馆:(
-
好的。然后使用
std::vector,不要使用多维数组。使用一维数组并创建一个访问器函数,该函数将访问一维数组中的元素 (i,j)。这样你就可以让一切变得最快。还要记住,更多的线程并不意味着更快的结果。从 1 个线程开始,不断增加数量并研究速度与内核数量的关系,并尝试了解结果。
标签: c++ parallel-processing openmp