我正在通过遍历排列树广度优先来开发并行数独求解算法。
我有一个根进程,它有一个拼图实例队列。 根进程允许工作进程对拼图的实例进行入队()和出列()。
我是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_fatal
或MPI_Recv
调用中出现MPI_Ssend
错误。我总是可以成功dequeue()
第一个元素(使用简单的print_puzzle()
方法测试)。
非常感谢任何帮助。谢谢。