Multithreading 如何在openmp中的多个线程之间分配任务?
我想使用Openmp在四个线程之间分配任务。我有20x20矩阵,任务应该平均分布在四个线程中,下面的程序给出错误的结果。我认为它需要改变for循环中的参数,有人能帮我吗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) {
#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);
}