MPI - 分布式工作人员队列

时间:2015-12-11 04:20:30

标签: c parallel-processing pthreads mpi task-queue

我正在通过遍历排列树广度优先来开发并行数独求解算法。

我有一个根进程,它有一个拼图实例队列。 根进程允许工作进程对拼图的实例进行入队()和出列()。

我是MPI的新手,所以如果这种方法可行,请告诉我。

主进程将有两个线程不断运行

MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided)
if(rank == 0){
    push(puzzle);

    pthread_t dequeue_listener, enqueue_listener;
    pthread_create(&dequeue_listener, NULL, dequeue_listen, NULL);
    pthread_create(&enqueue_listener, NULL, enqueue_listen, NULL);
}

一个用于侦听入队请求,另一个用于出列请求

void *dequeue_listen(){
    while(1)
        MPI_Ssend(pop(), SIZE, MPI_INT, 1, 0, MPI_COMM_WORLD);
}

void *enqueue_listen(){
     while(1){
         int *buffer = malloc(sizeof(int)*SIZE);
         MPI_Recv(buffer, SIZE, MPI_INT, 1, 0, MPI_COMM_WORLD, &status);
         push(buffer);
     }
}

pop()和push()都是主节点执行的直接与队列交互的方法。

工作进程将执行以下操作(注意,为简单起见,我修改了代码)

while(!is_empty(queue) && !solution_found){
    dequeue();
    process_children_and_check_for_solution();
    enqueue(children);
}

其API如下:

int *dequeue(){
    int *puzzle = malloc(sizeof(int)*SIZE);
    MPI_Recv(puzzle, SIZE, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
    return puzzle;
}

void enqueue(int *puzzle){
    MPI_Ssend(puzzle, SIZE, MPI_INT, 0, 0, MPI_COMM_WORLD);  
}

理论上,这对我来说很有意义,并且可以在涉及工作队列的许多应用程序中使用。 但是..我一直在根进程的MPI_fatalMPI_Recv调用中出现MPI_Ssend错误。我总是可以成功dequeue()第一个元素(使用简单的print_puzzle()方法测试)。

非常感谢任何帮助。谢谢。

0 个答案:

没有答案