Я написал программу, которая вводит размер матрицы и количество потоков, а затем генерирует случайную двоичную матрицу из нулей и единиц. Затем мне нужно найти кластеры из единиц и присвоить каждому кластеру уникальный номер.
Я получаю вывод правильно, но у меня проблема с распараллеливанием функции.
Мой профессор попросил меня разбить строки матрицы на части «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: Мне нужно показать как последовательное время, так и параллельное время и показать, что у меня есть увеличение производительности из-за распараллеливания.
#pragma omp parallel for
, и openmp волшебным образом решит все остальное (кроме синхронизации) - person Andreas Grapentin   schedule 27.01.2013