Multithreading 如何在openmp中的多个线程之间分配任务?

Multithreading 如何在openmp中的多个线程之间分配任务?,multithreading,openmp,Multithreading,Openmp,我想使用Openmp在四个线程之间分配任务。我有20x20矩阵,任务应该平均分布在四个线程中,下面的程序给出错误的结果。我认为它需要改变for循环中的参数,有人能帮我吗 #include<stdio.h> #include<omp.h> #include "head.h" //int sum=0; int c[20][20]; //#include<conio.h> int main(void) {

我想使用Openmp在四个线程之间分配任务。我有20x20矩阵,任务应该平均分布在四个线程中,下面的程序给出错误的结果。我认为它需要改变for循环中的参数,有人能帮我吗

#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;
            static int j,e;
            static sum=0;
            FILE *fp;
            unsigned long long a,b,c,d;

            int threadno;
            fp=fopen("m2.txt","w");
            //    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;
                    }
                }
                }
            }

            else 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++)
                {
                    for (e=5;e<10;e++)
                    {
                    sum+=A[i][e]*B[e][j];
                            C[i][j]=sum;
                    }
                }
                }
            }


            else 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;
                    }
                }
                }
            }

            else 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;
                    }
                }
                }
            }       

            for (i=0;i<20;i++){
                for (j=0;j<20;j++) {
                    fprintf(fp,"%d \t",C[i][j]);
                }
            }
    }
    fclose(fp); 
    }   
#包括
#包括
#包括“head.h”
//整数和=0;
INTC[20][20];
//#包括
内部主(空){
INTA[20][20],B[20][20],C[20][20];;
int i;
静态int j,e;
静态和=0;
文件*fp;
无符号长a、b、c、d;
int-threadno;
fp=fopen(“m2.txt”,“w”);
//printf(“\n%d\n”,h[20][20]);
#pragma omp并行共享(a、b、c、d)
{
threadno=omp_get_thread_num();
如果(threadno==0)
{       

对于(i=0;i,每个线程仅在对角线周围生成25个值。这是您的意图吗?您的矩阵有400个条目,但实际上您只初始化了其中的4*25=100个条目,因此最后的打印输出将大部分是垃圾,对角线周围除外

所有线程也在访问变量
sum
,而没有任何锁定/同步,因此从sum中读取的值是完全不确定的

如果您真的打算编写一个矩阵*矩阵乘法:那么您应该首先编写您打算编写的三重嵌套循环。可能类似于:

for (int i=0; i<20; i++) {
  for (int j=0; j<20; j++) {
    for (int e=0; e<20; e++) {
      // some work
    }
  }
}

for(int i=0;i使用此函数。将浮点更改为int

void matrix_mult_scalar_openmp(const float*A , const float* B, float* C, const int N, const int M, const int K) {
    #pragma omp parallel for
    for(int i=0; i<N; i++) {
        for(int j=0; j<K; j++) {
            float tmp = 0;
            for(int l=0; l<M; l++) {
                tmp += A[M*i+l]*B[K*l+j];
            }
            C[K*i + j] = tmp;
        }
    }
}
void matrix\u mult\u scalar\u openmp(常量浮点*A、常量浮点*B、浮点*C、常量整数N、常量整数M、常量整数K){
#pragma-omp并行

对于(int i=0;i我必须使用4个线程来完成这项工作,因为它使用single for loop工作,但我想在4个线程之间设置任务。我按照Raxman进行了更改,一些代码没有更改,因为我在这里必须使用4个线程。 我修改的代码是:

#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;
        static int j,e;
        int sum;
        FILE *fp;
        unsigned long long a,b,c,d;

        int threadno;
        fp=fopen("m2.txt","w");
         for (i=0;i<20;i++)
            {
            for (j=0;j<20;j++)
            {
                A[i][j]=i*j;
                B[i][j]=i*j;
            }
            }
        //    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++)
            {
                sum=0;
                for (e=0;e<5;e++)
                {
                sum+=A[i][e]*B[e][j];
//                          C[i][j]=sum;
                }
             C[i][j]=sum;
            }
            }
        }

        else 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;
                }
             C[i][j]=sum;
            }
            }
        }


        else 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++)
            {
                sum=0;
                for (e=10;e<15;e++)
                {
                sum+=A[i][e]*B[e][j];
                    }
             C[i][j]=sum;
            }
            }
        }

        else 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++)
            {
                sum=0;
                for (e=15;e<20;e++)
                {
                sum+=A[i][e]*B[e][j];
                        //C[i][j]=sum;
                }
             C[i][j]=sum;
            }
            }
        }       

        for (i=0;i<20;i++){
            for (j=0;j<20;j++) {
                fprintf(fp,"%d \t",C[i][j]);
            }
        }
}
fclose(fp); 
}   
#包括
#包括
#包括“head.h”
//整数和=0;
INTC[20][20];
//#包括
内部主(空){
INTA[20][20],B[20][20],C[20][20];;
int i;
静态int j,e;
整数和;
文件*fp;
无符号长a、b、c、d;
int-threadno;
fp=fopen(“m2.txt”,“w”);
对于(i=0;i
void matrix_mult_scalar_openmp(const float*A , const float* B, float* C, const int N, const int M, const int K) {
    #pragma omp parallel for
    for(int i=0; i<N; i++) {
        for(int j=0; j<K; j++) {
            float tmp = 0;
            for(int l=0; l<M; l++) {
                tmp += A[M*i+l]*B[K*l+j];
            }
            C[K*i + j] = tmp;
        }
    }
}
#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;
        static int j,e;
        int sum;
        FILE *fp;
        unsigned long long a,b,c,d;

        int threadno;
        fp=fopen("m2.txt","w");
         for (i=0;i<20;i++)
            {
            for (j=0;j<20;j++)
            {
                A[i][j]=i*j;
                B[i][j]=i*j;
            }
            }
        //    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++)
            {
                sum=0;
                for (e=0;e<5;e++)
                {
                sum+=A[i][e]*B[e][j];
//                          C[i][j]=sum;
                }
             C[i][j]=sum;
            }
            }
        }

        else 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;
                }
             C[i][j]=sum;
            }
            }
        }


        else 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++)
            {
                sum=0;
                for (e=10;e<15;e++)
                {
                sum+=A[i][e]*B[e][j];
                    }
             C[i][j]=sum;
            }
            }
        }

        else 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++)
            {
                sum=0;
                for (e=15;e<20;e++)
                {
                sum+=A[i][e]*B[e][j];
                        //C[i][j]=sum;
                }
             C[i][j]=sum;
            }
            }
        }       

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