我正在为一个大学项目与OpenMP进行并行化。我的问题如下:我对自身进行对称矩阵的布尔乘法,即我需要计算矩阵的平方。我检查乘法的结果是否等于原始矩阵。我想知道如何选择块大小,知道矩阵的维度可以从小值(如10)变为高值(例如3000)。这是代码:
bool booleanmult(int dimension,bool** mat,bool** B){
int m,n,k,chunk;
bool temp=false;
bool stop=false;
#pragma omp parallel shared(mat,B,stop,temp) private(m,n,k)
{
omp_set_num_threads(4);
chunk=dimension/omp_get_num_threads();
printf("Chunk size = %d \n",chunk);
// Boolean Multiplication
#pragma omp for schedule(dynamic,chunk ) reduction(||:temp)
for (m=0; m<dimension; m++) {
for (n=0; n<dimension; n++) {
for (k=0; k<dimension; k++) {
temp=mat[m][k] && mat[n][k];
B[m][n]= B[m][n] || temp;
}
if(stop==false && !(B[m][n]==mat[m][n])){
stop=true;
}
}
}
}
return stop;
}
此外,我想如果完成的并行化是正确的,即仅并行化最外部的。谢谢!!
答案 0 :(得分:0)
目前尚不清楚为什么使用具有显式块大小的动态调度。这是你项目中的约束吗?如果没有,请尝试使用静态(主要是默认)调度,并测量其加速。然后,尝试使用几个块号来dynamic
。我没有看到OpenMP调度策略及其参数会对您的代码产生很大影响。
此外,我不明白为什么temp
与reduction
一起宣布。 temp
在每次循环迭代(k
)中重置。减少仅在累积结果时才有意义。因此,首先修复代码,然后进行优化以获得更好的加速。
答案 1 :(得分:0)
ı看到您没有使用SPMD模式,为什么要使用omp_set_num_threads(4),如果您不希望获得更好的性能ı认为