D 编程语言的 MPI

标签 mpi d

这个问题与这个问题有关:MPI and D: Linker Options

我正在尝试让 MPI 从 D 中工作。在网上可以找到几篇文章,但我发现没有一个确实有效......所以这是我到目前为止所做的:

我从这里获取了 mpi.d https://github.com/1100110/OpenMPI/blob/master/mpi.d并设置一个最小程序:

import mpi;
import std.stdio;

void* MPI_COMM_WORLD = cast(void*)0;

int main(string[] args)
{

  int rank, size;
  int argc = cast(int)args.length;
  char *** argv = cast(char***)&args;


  MPI_Init (&argc, argv);   /* starts MPI */
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);    /* get current process id */
  MPI_Comm_size (MPI_COMM_WORLD, &size);    /* get number of processes */
  writefln( "Hello world from process %d of %d", rank, size );
  MPI_Finalize();

  return 0;
}

我编译
dmd test_mpi.d -L-L/usr/lib/openmpi -L-lmpi -L-ldl -L-lhwloc

或者
gdc test_mpi.d -pthread -L/usr/lib/openmpi -lmpi -ldl -lhwloc -o test_mpi

并运行
mpirun -n 2 ./test_mpi

这是我得到的错误:
[box:1871] *** An error occurred in MPI_Comm_rank
[box:1871] *** on communicator MPI_COMM_WORLD
[box:1871] *** MPI_ERR_COMM: invalid communicator
[box:1871] *** MPI_ERRORS_ARE_FATAL: your MPI job will now abort
--------------------------------------------------------------------------
mpirun has exited due to process rank 0 with PID 1870 on
node bermuda-iii exiting improperly. There are two reasons this could occur:

1. this process did not call "init" before exiting, but others in
the job did. This can cause a job to hang indefinitely while it waits
for all processes to call "init". By rule, if one process calls "init",
then ALL processes must call "init" prior to termination.

2. this process called "init", but exited without calling "finalize".
By rule, all processes that call "init" MUST call "finalize" prior to
exiting or it will be considered an "abnormal termination"

This may have caused other processes in the application to be
terminated by signals sent by mpirun (as reported here).
--------------------------------------------------------------------------
[box:01869] 1 more process has sent help message help-mpi-errors.txt / mpi_errors_are_fatal
[box:01869] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messages

显然我确实调用了 MPI_Init 和 MPI_Finalize。那么我错过了什么?

最佳答案

在 Open MPI C 中,通信器句柄是指向实际通信器结构的指针。 MPI_COMM_WORLD是指向预先创建的世界通信器结构的指针,而不是您定义的 NULL 指针。这就是 Open MPI 在调用 MPI_COMM_RANK 时中止的原因。 - 相当于调用MPI_Comm_rank(NULL, &rank)在 C.

如果你看看line 808mpi.d ,您会注意到 MPI_COMM_WORLD已经定义为:

MPI_COMM_WORLD      = cast(void*) &(ompi_mpi_comm_world),

因此,如果您删除重新定义 MPI_COMM_WORLD 的行,您的代码应该可以工作。 .

关于D 编程语言的 MPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14731834/

相关文章:

templates - D中解析模板元组参数

d - 添加到 D 中的动态数组?

python - C(P)ython 或 D 中的多平台 gui 应用程序

c - 信号: Segmentation fault (11)

centos - 加载共享库时出错

c++ - Visual Studio C++ 中的 msmpi.dll 错误消息

c++ - MPI_Comm_spawn 和 MPI_Reduce

MPI 程序的调试和测试

D 编译时的任意代码

检查字符串时出现 dlang 不兼容类型错误