0

行列のサイズとスレッド数を入力し、0 と 1 のランダムなバイナリ行列を生成するプログラムを作成しました。次に、1 のクラスターを見つけて、各クラスターに一意の番号を付ける必要があります。

出力は正しく取得していますが、関数の並列化に問題があります。

私の教授は、行列の行を「thread_cnt」部分に分割するように私に依頼しました。つまり、スレッド サイズが 4 で行列サイズが 8 の場合、それぞれ 2 行の 4 つの行列に分割されます。

コードは次のとおりです。

//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: シリアル時間と並列時間の両方を表示し、並列化によってパフォーマンスが向上したことを示す必要があります。

4

1 に答える 1