2011-01-29 11 views
1

私はこのコードを持っており、pthreadsとMPIを利用しようとしています。 私は奇妙な問題に直面しています。 dist.startとdist.endはpthread関数で同じでなければなりませんが、これは起こりません。 問題が分かっている人は誰ですか?pthreadsでMPIを使用する - 奇妙な問題

私の英語のために残念です。各スレッドに

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

} 

答えて

3

あなたdist引数は、トップレベルで宣言単一のグローバルインスタンスへのポインタです。作成しているスレッドは、mainのループが移動し、異なる値をdistに書き込んだときに、後でその引数からスポーンされ、読み込まれます。 NUMTHRDSの配列を割り当てるなど、スレッドごとにDISTインスタンスが必要です。