gpt4 book ai didi

c - MPI 和线程

转载 作者:太空宇宙 更新时间:2023-11-04 04:05:04 34 4
gpt4 key购买 nike

我是 MPI 的初学者,我想通过以下方式将线程与 MPI 结合使用。某些进程(甚至所有进程)生成线程并阻塞等待接收消息。每个 proc 产生的线程数是一个命令行参数。所以如果有 4 个进程,进程 0 和 2 会产生一个线程。现在,我希望进程 0 和 2 都向所有线程发送消息。例如,进程 0 将消息发送给自己和进程 2,进程 2 将消息发送给进程 0 和自己。这是我的代码的样子,它显然没有达到预期的效果。它只是等待接收消息。我哪里错了?

谢谢!

  typedef struct {
int id;
} struct_t;

void *hello(void *arg)
{
int rank;
char mystr[10];
MPI_Status status;
struct_t *fd=(struct_t *)arg;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
printf("Rank %d is waiting in thread %d for my message\n", rank, fd->id);

if(rank%2 ==0){
MPI_Recv(mystr, 10, MPI_CHAR, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
printf("Thread %d on rank %d received %s\n", fd->id, rank, mystr);
}

return (NULL);
}

void spawn_thread(int n)
{
int size,rank, i;
pthread_t *threads;
pthread_attr_t pthread_custom_attr;
struct_t *fd;
threads=(pthread_t *)malloc(n*sizeof(*threads));
pthread_attr_init(&pthread_custom_attr);
fd=(struct_t *)malloc(sizeof(struct_t)*n);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

/* Start up thread */
for (i=0; i<n; i++)
{
fd[i].id=i;
// printf("My rank is %d and I created thread #%d\n", rank, i);
pthread_create(&threads[i], &pthread_custom_attr, hello, (void *)(fd+i));
}

/* Synchronize the completion of each thread. */
for (i=0; i<n; i++)
{
pthread_join(threads[i],NULL);
}
free(fd);
}
void main(int argc, char ** argv)
{
int n,i, provided, claimed;
int rank, size, errs;

MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

if (argc != 2)
{
printf ("Usage: %s n\n where n is no. of threads\n",argv[0]);
exit(1);
}

n=atoi(argv[1]);
if ((n < 1) || (n > MAX_THREAD))
{
printf ("The no of thread should between 1 and %d.\n",MAX_THREAD);
MPI_Abort(MPI_COMM_WORLD,-1);
}

if(rank%2 == 0)
spawn_thread(n);

if(rank%2 == 0){

printf("My rank is %d and I am sending Hello!\n", rank);
MPI_Send("HELLOOO", 10, MPI_CHAR, rank, 0, MPI_COMM_WORLD);
}

MPI_Finalize();
}

最佳答案

我不完全确定我理解您想要实现的目标,但请注意,您所有排名均匀的进程的线程都会在接收时阻塞,因此没有人会运行发送代码。您的奇数进程的线程只是立即开始和结束,因为它们不会做任何事情。

可能是以下情况:

    if(rank%2 == 0){
printf("My rank is %d and I am sending Hello!\n", rank);
MPI_Send("HELLOOO", 10, MPI_CHAR, rank, 0, MPI_COMM_WORLD);
}

应该是这样的:

    if(rank%2 != 0)

这样你排名奇数的进程至少会发送命令?

或者,您需要将“加入”代码移到 spawn_thread 函数之外,并在调用发送后执行加入。

希望这对您有所帮助。

关于c - MPI 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7168641/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com