【问题标题】:Parallelize a Function using openMP in C在 C 中使用 openMP 并行化函数
【发布时间】:2013-01-10 12:57:31
【问题描述】:

我编写了一个程序,它输入矩阵大小和线程数,然后生成一个由 0 和 1 组成的随机二进制矩阵。然后我需要找到 1 的集群并给每个集群一个唯一的数字。

我得到了正确的输出,但是我在并行化函数时遇到了问题。

我的教授要求我将矩阵行分解为“thread_cnt”部分。即:线程大小为 4,矩阵大小为 8,然后它分成 4 个矩阵,每个矩阵有 2 行。

代码如下:

//Inputted Matrix size n and generated a binary matrix rand1[][]
//
begin = omp_get_wtime();
width = n/thread_cnt;
#pragma omp parallel num_threads(thread_cnt) for
for(d=0;d<n;d=d++)
{
    b=d+width;
    Mat(d,b);
    d=(d-1)+width;    
}

Mat(int w,int x)
{
//printf("\n Entered function\n");
for(i=w;i<x;i++)
{    
    for(j=0;j<n;j++)
    {
        //printf("\n Entered the loop also\n");
        //printf("i = %d, j = %d\n",i,j);
        if(rand1[i][j]==1)
        {
            rand1[i][j]=q;
            adj(i,j,q);
            q++;
        }
    }
}
}

adj(int p, int e, int m)            //Function to find adjacent 1's 
{   
//printf("\n Entered adj function\n");
//printf("\n p = %d e = %d m = %d\n",p,e,m);
if (rand1[p][e+1] == 1)
{
    //printf("Test1\n");
    rand1[p][e+1]=m;
    adj(p,e+1,m);
}
if (rand1[p+1][e] == 1)
{
    rand1[p+1][e]=m;        
    //printf("Test2\n");
    adj(p+1,e,m);
}
if (rand1[p][e-1] == 1 && e-1>=0)
{
    rand1[p][e-1]=m;
    //printf("Test3\n");
    adj(p,e-1,m);

}
if (p-1>=0 && rand1[p-1][e] == 1)
{
    rand1[p-1][e]=m;
    //printf("Test4\n");
    adj(p-1,e,m);
}

}

代码给了我正确的输出。但是当我增加线程数时,时间会增加而不是减少。对于 1 个线程,我得到 0.000076,对于 2 个线程,我得到 0.000136

它看起来像是迭代而不是并行化。 谁能帮我解决这个问题?

PS:我需要同时显示串行时间和并行时间,并表明我由于并行化而获得了性能提升。

【问题讨论】:

  • 你的循环看起来很奇怪。为什么要设置自定义线程数? openmp 旨在为您创建最佳数量的线程。
  • 我该怎么做?抱歉,我擅长 C 但我是 openMP 新手
  • 您只需使用#pragma omp parallel for,openmp 就会神奇地解决其他所有问题(同步除外)
  • 你可能应该使用一个更大的例子来计时。由于持续的线程创建开销,较小的示例往往具有奇怪的计时行为
  • 如果我只使用#pragma omp parallel 那么它将如何将我的矩阵分成几部分?我需要如何重写我的代码?

标签: c parallel-processing openmp openmpi


【解决方案1】:

线程数增加时时间增加的原因是每个线程都在执行第一个循环。看来,您没有将子矩阵放入线程中,而是每个线程都对每个子矩阵(即所有矩阵)进行操作。 要使线程分别在矩阵上工作,您应该使用它们唯一的 tid 编号,您可以通过这一行获得:

 tid = omp_get_thread_num();

然后你应该做一个简单的映射:如果 pid 是我在第 (i+1) 个子矩阵上操作,其中 0

Mat(i*width,i*width+width)

【讨论】:

  • 那不正确。每个线程将计算循环的迭代
猜你喜欢
  • 1970-01-01
  • 2013-09-19
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
相关资源
最近更新 更多