Blitz ++,犰狳和OpenMP非常慢

时间:2018-08-28 11:32:27

标签: openmp armadillo blitz++

我已经尝试了很长时间来学习如何并行化,并且我已经阅读了许多有关OpenMP的笔记。所以,我尝试使用它,得到的结果是,我尝试并行化的所有位置都比串行情况慢了5倍,我想知道为什么...

我的代码是下一个:

  • toevaluate是两列和两行长度的闪电矩阵。
  • storecalljstorecallk只是我用来存储调用并避免额外的函数调用的两个闪电矢量。
  • matrix是一个方形的犰狳矩阵,其长度为列(cols =行),而行的长度为行(我稍后将其用于其他事物,将其定义为犰狳矩阵更方便)
  • externfunction1是在此函数之外定义的函数,该函数计算f(a,b)函数的(x,y)值,其中(a,b)是输入,而(x,y)是输出。
  • Problem是一个字符串变量,而normal是一个布尔值。
  • resultkresultj是存储此类函数输出的矢量(x,y)。
  • externfunction2是在此函数之外定义的另一个函数,该函数通过评估funcci(i = 1,2)(闪击多项式)来计算double。该多项式以double:innerprod求值,得出另一个double:wvaluei(i = 1,2)。

我认为这些都是概括性的。代码如下。

{
omp_set_dynamic(0);

OMP_NUM_THREADS=4;

omp_set_num_threads(OMP_NUM_THREADS);

int chunk = int(floor(cols/OMP_NUM_THREADS));

#pragma omp parallel shared(matrix,storecallj,toevaluate,resultj,cols,rows, storecallk,atzero,innerprod,wvalue1,wvalue2,funcc1, funcc2,storediff,checking,problem,normal,chunk) private(tid,j,k)
    {

        tid = omp_get_thread_num();
        if (tid == 0)
        {
            printf("Initializing parallel process...\n");
        }
        #pragma omp for collapse(2) schedule (dynamic, chunk) nowait
        for(j=0; j<cols; ++j)
        {
            for(k=0; k<rows; ++k)
            {
                    storecallj = toevaluate(j, All);
                    externfunction1(problem,normal,storecallj,resultj);
                storecallk = toevaluate(k, All);
                storediff = storecallj-storecallk;
                if(k==j){
                    Matrix(j,k)=-atzero*sum(resultj*resultj);
                }else{
                    innerprod =sqrt(sum(storediff* storediff));
                    checking=1.0-c* innerprod;
                    if(checking>0.0)
                    {
                        externfunction1(problem,normal, storecallk,resultk);
                        externfunction2(c, innerprod, funcc1, wvalue1);
                        externfunction2(c, innerprod, funcc2, wvalue2);
                        Matrix(j,k)=-wvalue2*sum(storediff*resultj)*sum(storediff*resultk)-wvalue1*sum(resultj*resultk);
                    }
                }
            }
        }
    }
}

,它非常慢。我尝试过的另一件事是:

for(j=0; j<cols; ++j)
{
    storecallj = toevaluate(j, All);
    externfunction1(problem,normal,storecallj,resultj);
   #pragma omp for collapse(2) schedule (dynamic, chunk) nowait
    for(k=0; k<rows; ++k)
    {
        storecallk = toevaluate(k, All);
        storediff = storecallj-storecallk;
       ...

我使用动态的是因为要避免出现问题,以防评估的总分不是4的倍数。

有人可以帮我理解为什么这么慢吗?

0 个答案:

没有答案