openMP块大小,我应该选择哪个?

时间:2014-07-04 13:55:01

标签: multithreading matrix parallel-processing openmp

我正在为一个大学项目与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;
}

此外,我想如果完成的并行化是正确的,即仅并行化最外部的。谢谢!!

2 个答案:

答案 0 :(得分:0)

目前尚不清楚为什么使用具有显式块大小的动态调度。这是你项目中的约束吗?如果没有,请尝试使用静态(主要是默认)调度,并测量其加速。然后,尝试使用几个块号来dynamic。我没有看到OpenMP调度策略及其参数会对您的代码产生很大影响。

此外,我不明白为什么tempreduction一起宣布。 temp在每次循环迭代(k)中重置。减少仅在累积结果时才有意义。因此,首先修复代码,然后进行优化以获得更好的加速。

答案 1 :(得分:0)

ı看到您没有使用SPMD模式,为什么要使用omp_set_num_threads(4),如果您不希望获得更好的性能ı认为