Saya memiliki kode ini dan saya mencoba memanfaatkan pthreads dan MPI. Saya menghadapi masalah yang aneh. dist.start dan dist.end harus sama di fungsi pthread tetapi ini tidak terjadi. Adakah yang tahu apa masalahnya?
Maaf untuk bahasa Inggris saya.
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <mpi.h>
void *compute_multiplication(void *arg);
#define NUMTHRDS 2
#define VECLEN 100
#define SUCCESS 1
typedef struct
{
int start;
int end;
int rank;
}DIST;
typedef struct
{
double *a;
double *b;
double sum;
int veclen;
}DOTDATA;
DOTDATA dotstr;
DIST dist;
pthread_t threads[NUMTHRDS];
pthread_mutex_t mutexsum;
int main(int argc, char *argv[])
{
double *a;
double *b;
int i;
int *status;
int err;
int rank;
int size;
int div;
a = (double *)malloc(NUMTHRDS*VECLEN*sizeof(double));
b = (double *)malloc(NUMTHRDS*VECLEN*sizeof(double));
err = MPI_Init(&argc, &argv);
if(err!=MPI_SUCCESS)
MPI_Abort(MPI_COMM_WORLD, err);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
div = NUMTHRDS*VECLEN/size;
for(i=0;i<VECLEN*NUMTHRDS;i++)
{
a[i] = 1.0;
b[i] = 2*a[i];
}
dotstr.veclen = VECLEN;
dotstr.a = a;
dotstr.b = b;
dotstr.sum = 0;
pthread_mutex_init(&mutexsum,NULL);
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
for(i=0;i<NUMTHRDS;i++)
{
if(i==0)
{
dist.start = rank*div;
}
if(i==1)
{
dist.start = dist.end;
}
dist.end = dist.start + div/2;
dist.rank = rank;
printf("rank:%d dists:%d diste1:%d\n",rank,dist.start,dist.end);
pthread_create(&threads[i],&attr,compute_multiplication,&dist);
}
pthread_attr_destroy(&attr);
for(i=0;i<NUMTHRDS;i++)
{
int err;
pthread_join(threads[i],(void *) &status);
}
if(rank==0)
{
printf("SUM:%f\n",dotstr.sum);
}
free(a);
free(b);
pthread_mutex_destroy(&mutexsum);
MPI_Finalize();
return 0;
}
void *compute_multiplication(void *arg)
{
int i;
DIST* input = (DIST *)arg;
int start = input->start;
int end = input->end;
int sum = 0;
printf("(%d)%d %d\n",input->rank, start,end);
//for(i=start;i<end;i++)
//{
// sum = sum + dotstr.a[i]*dotstr.b[i];
//}
//printf("dists:%d diste1:%d\n",dist.start,dist.end);
pthread_mutex_lock(&mutexsum);
dotstr.sum = sum;
pthread_mutex_unlock(&mutexsum);
pthread_exit((void*) 0);
}