我写了一个程序,它输入矩阵大小和线程数,然后生成一个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:我需要显示串行时间和并行时间,并显示由于并行化而导致性能提升。
答案 0 :(得分:0)
当线程数增加时,时间增加的原因是每个线程正在执行第一个循环。看来,你没有将子矩阵赋予线程,而是每个线程都在每个子矩阵上运行,即所有矩阵。 为了使线程单独使用矩阵,你应该使用它们可以用这一行获得的唯一tid编号:
tid = omp_get_thread_num();
然后你应该做一个简单的映射:如果pid是我操作第(i + 1)个子矩阵,其中0&lt; = i&lt; = nthreads-1 哪个可能编码为:
Mat(i*width,i*width+width)