0

私は 20 の配列を取っています。そして、openMP を使用して、4 つのスレッドのそれぞれに 1/4 番目のタスクを順番に割り当てます。そして、配列全体の結果をファイルに保存します。ここで何が問題なのですか?

最初の配列では、各要素に i*j 値を割り当ててから、20 x 20 の行列乗算を行います。

#include<stdio.h>
#include<omp.h>
#include "head.h"

int sum=0;  
int c[20][20];
//#include<conio.h>

int main(void) {
    int A[20][20],B[20][20],C[20][20];
    int i,j,e;
    static sum=0;
    FILE *fp;

    unsigned long long a,b,c,d;
    int threadno;
    fp=fopen("m2.txt","w");
    //    clrscr();
    printf("\n%d \n",h[20][20]);

    #pragma omp parallel shared(a,b,c,d)
    {
        threadno=omp_get_thread_num();

        if(threadno==0)
        {   
            for (i=0;i<5;i++)
            for (j=0;j<5;j++)
                A[i][j]=i*j;
                B[i][j]=i*j;

            for (i=0;i<5;i++)
            for (j=0;j<5;j++)
                    for (e=0;e<5;e++)
                sum+=A[i][e]*B[e][j];
                    C[i][j]=sum;
            //fprintf(fp,"%d \t",C[i][j]);
        }

    }

    if(threadno==1)
    {   
        for (i=5;i<10;i++)
        for (j=5;j<10;j++)
            A[i][j]=i*j;
            B[i][j]=i*j;

        for (i=5;i<10;i++)
         for (j=5;j<10;j++) {
             sum=0;
             for (e=5;e<10;e++)
             sum+=A[i][e]*B[e][j];
             C[i][j]=sum;
            //fprintf(fp,"%d \t",C[i][j]);
           }
        }

    if(threadno==2)
    {   
        for (i=10;i<15;i++)
        for (j=10;j<15;j++)
            A[i][j]=i*j;
                B[i][j]=i*j;

        for (i=10;i<15;i++)
        for (j=10;j<15;j++) {
            for (e=10;e<15;e++)
                sum+=A[i][e]*B[e][j];
            C[i][j]=sum;
                //fprintf(fp,"%d \t",C[i][j]);
        }
    }

    if(threadno==3)
    {   
        for (i=15;i<20;i++)
        for (j=15;j<20;j++)
                A[i][j]=i*j;
            B[i][j]=i*j;

        for (i=15;i<20;i++)
        for (j=15;j<20;j++) {
            for (e=15;e<20;e++)
            sum+=A[i][e]*B[e][j];
            C[i][j]=sum;
                //fprintf(fp,"%d \t",C[i][j]);
        }
    }


    for (i=0;i<20;i++){
        for (j=0;j<20;j++) {
        fprintf(fp,"%d \t",C[i][j]);
        }
    }
}

fclose(fp); 
}   
4

1 に答える 1

1

ブレースが一致していません。if(threadno==0)if セクションの直後に並列セクションを閉じます。

また、コードの最後に余分な中括弧があるようです。

Dave が述べたように、for ステートメントには 2 つの中括弧がありません。これは問題の原因ではありませんが、アルゴリズムが予期した結果を返さない原因となります。

Cで

for(i = 0; i < n; i++)
     function(i);

for ループで単一の操作を実行する場合

または、for ループに複数の操作を含める場合は中括弧を使用します

for(i = 0; i < n; i++){
     function(i);
     function2(i);
     function3(i);
}
于 2013-03-21T00:28:47.410 に答える