使用MPI与pthreads - 奇怪的问题

时间:2011-01-29 20:19:52

标签: c pthreads mpi

我有这个代码,我尝试使用pthreads和MPI。 我面临着一个奇怪的问题。 dist.start和dist.end在pthread函数中必须相同,但这不会发生。 谁知道问题是什么?

抱歉我的英文。

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

}

1 个答案:

答案 0 :(得分:3)

每个线程的dist参数是指向顶层声明的单个全局实例的指针。当main中的循环移动并将不同的值写入dist时,稍后会产生并创建正在创建的线程。您希望每个线程有DIST个实例,例如通过分配NUMTHRDS个数组。

相关问题