Menggunakan MPI dengan pthreads - Masalah aneh

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);

}

person fonfon    schedule 29.01.2011    source sumber


Jawaban (1)


Argumen dist Anda untuk setiap thread adalah penunjuk ke satu instance global yang dideklarasikan di tingkat atas. Thread yang Anda buat akan muncul dan dibaca dari argumen tersebut beberapa waktu kemudian, ketika loop di main telah berpindah dan menulis nilai yang berbeda ke dalam dist. Anda menginginkan DIST instance per thread, misalnya dengan mengalokasikan array yang terdiri dari NUMTHRDS di antaranya.

person Phil Miller    schedule 29.01.2011