diff --git a/notebooks/julia_mpi.ipynb b/notebooks/julia_mpi.ipynb index 003ef49..ef666e6 100644 --- a/notebooks/julia_mpi.ipynb +++ b/notebooks/julia_mpi.ipynb @@ -691,7 +691,7 @@ "\n", "\n", "
\n", - "Note: In Julia, send and receive buffers are usually arrays or references.\n", + "Note: Note that the C interface provides additional arguments `MPI_Datatype` (type of data to send/receive) and `count` (number of items to send/receive). In Julia, send and receive buffers are usually arrays or references, from which the data type and the count can be inferred. This is true for many other MPI functions.\n", "
" ] }, diff --git a/notebooks/mpi_collectives.ipynb b/notebooks/mpi_collectives.ipynb index 8fd5042..00894f6 100644 --- a/notebooks/mpi_collectives.ipynb +++ b/notebooks/mpi_collectives.ipynb @@ -90,7 +90,7 @@ }, { "cell_type": "markdown", - "id": "d7ba2558", + "id": "e9e2a219", "metadata": {}, "source": [ "## MPI_Barrier\n", @@ -110,7 +110,7 @@ }, { "cell_type": "markdown", - "id": "5ae78757", + "id": "d9753e4b", "metadata": {}, "source": [ "### Example\n", @@ -120,25 +120,10 @@ }, { "cell_type": "code", - "execution_count": 59, - "id": "c21ec2fb", + "execution_count": null, + "id": "9a66c717", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[rank 3] I woke up\n", - "[rank 0] I woke up\n", - "[rank 2] I woke up\n", - "[rank 1] I woke up\n", - "[rank 0] Done!\n", - "[rank 1] Done!\n", - "[rank 2] Done!\n", - "[rank 3] Done!\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -155,7 +140,7 @@ }, { "cell_type": "markdown", - "id": "ff3bece9", + "id": "df0223ff", "metadata": {}, "source": [ "## MPI_Reduce\n", @@ -183,7 +168,7 @@ }, { "cell_type": "markdown", - "id": "0538ef9f", + "id": "2fc1aa28", "metadata": {}, "source": [ "### Example\n", @@ -192,23 +177,10 @@ }, { "cell_type": "code", - "execution_count": 74, - "id": "481eaa2c", + "execution_count": null, + "id": "341b8438", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[rank 0] I am contributing with [4]\n", - "[rank 1] I am contributing with [1]\n", - "[rank 2] I am contributing with [4]\n", - "[rank 2] The sum is nothing\n", - "[rank 0] The sum is [9][rank 1] The sum is nothing\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -234,7 +206,7 @@ }, { "cell_type": "markdown", - "id": "8daac465", + "id": "3ea77a8f", "metadata": {}, "source": [ "## Reducing multiple values\n", @@ -244,7 +216,7 @@ }, { "cell_type": "markdown", - "id": "13199da4", + "id": "b26fd0b2", "metadata": {}, "source": [ "### Example\n", @@ -254,23 +226,10 @@ }, { "cell_type": "code", - "execution_count": 75, - "id": "52bcb006", + "execution_count": null, + "id": "1a145948", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[rank 0] I am contributing with [1, 4]\n", - "[rank 1] I am contributing with [2, 4]\n", - "[rank 2] I am contributing with [3, 3]\n", - "[rank 0] The sum is [6, 11]\n", - "[rank 1] The sum is nothing\n", - "[rank 2] The sum is nothing\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -293,7 +252,7 @@ }, { "cell_type": "markdown", - "id": "852e2517", + "id": "539df34f", "metadata": {}, "source": [ "## MPI_Allreduce\n", @@ -303,7 +262,7 @@ }, { "cell_type": "markdown", - "id": "fb83387b", + "id": "be0381bb", "metadata": {}, "source": [ "### Example\n", @@ -313,23 +272,10 @@ }, { "cell_type": "code", - "execution_count": 79, - "id": "c15c908a", + "execution_count": null, + "id": "1595f4f5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[rank 1] I am contributing with [2, 1]\n", - "[rank 2] I am contributing with [3, 3]\n", - "[rank 0] I am contributing with [3, 3]\n", - "[rank 0] The sum is [8, 7]\n", - "[rank 1] The sum is [8, 7]\n", - "[rank 2] The sum is [8, 7]\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -370,7 +316,7 @@ }, { "cell_type": "markdown", - "id": "f201abe7", + "id": "3d0a1e9d", "metadata": {}, "source": [ "### Example\n", @@ -395,23 +341,10 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": null, "id": "1f8a70c6", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[rank 1] I am sending [30]\n", - "[rank 2] I am sending [40]\n", - "[rank 0] I am sending [20]\n", - "[rank 0] I received [20, 30, 40]\n", - "[rank 1] I received nothing\n", - "[rank 2] I received nothing\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -438,7 +371,7 @@ }, { "cell_type": "markdown", - "id": "932c815a", + "id": "0f85f08d", "metadata": {}, "source": [ "## MPI_Allgather\n", @@ -448,7 +381,7 @@ }, { "cell_type": "markdown", - "id": "8572570f", + "id": "4bf2ef34", "metadata": {}, "source": [ "### Example" @@ -456,23 +389,10 @@ }, { "cell_type": "code", - "execution_count": 78, - "id": "5c9b98a2", + "execution_count": null, + "id": "070e1fc1", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[rank 0] I am sending [20]\n", - "[rank 1] I am sending [30]\n", - "[rank 2] I am sending [40]\n", - "[rank 0] I received [20, 30, 40]\n", - "[rank 1] I received [20, 30, 40]\n", - "[rank 2] I received [20, 30, 40]\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -493,7 +413,7 @@ }, { "cell_type": "markdown", - "id": "cf2ea30a", + "id": "fb6a9034", "metadata": {}, "source": [ "## MPI_Gatherv\n", @@ -503,7 +423,7 @@ }, { "cell_type": "markdown", - "id": "faf0951a", + "id": "e0d2998c", "metadata": {}, "source": [ "### Example\n", @@ -513,22 +433,10 @@ }, { "cell_type": "code", - "execution_count": 32, - "id": "8e65fcd0", + "execution_count": null, + "id": "23814278", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[rank 1] I am sending [10, 10]\n", - "[rank 2] I am sending [20, 20, 20]\n", - "[rank 3] I am sending [30, 30, 30, 30]\n", - "[rank 0] I am sending [0]\n", - "[rank 0] I received [0, 10, 10, 20, 20, 20, 30, 30, 30, 30]\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -562,7 +470,7 @@ }, { "cell_type": "markdown", - "id": "1fb65390", + "id": "25c2fb1e", "metadata": {}, "source": [ "## How to get the amount of data to be received?\n", @@ -572,7 +480,7 @@ }, { "cell_type": "markdown", - "id": "23c57c46", + "id": "12f9e2ca", "metadata": {}, "source": [ "### Example\n", @@ -582,22 +490,10 @@ }, { "cell_type": "code", - "execution_count": 39, - "id": "b89fc364", + "execution_count": null, + "id": "b10430a9", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[rank 1] I am sending [1, 1]\n", - "[rank 2] I am sending [2]\n", - "[rank 3] I am sending [3, 3, 3, 3]\n", - "[rank 0] I am sending [0]\n", - "[rank 0] I received [0, 1, 1, 2, 3, 3, 3, 3]\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -664,7 +560,7 @@ }, { "cell_type": "markdown", - "id": "1df3bc76", + "id": "e55aa353", "metadata": {}, "source": [ "### Example\n", @@ -689,22 +585,10 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "id": "5ea413fd", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[rank 0] I am sending: [20, 30, 40, 50]\n", - "[rank 0] I have received: 20\n", - "[rank 1] I have received: 30\n", - "[rank 2] I have received: 40\n", - "[rank 3] I have received: 50\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -751,7 +635,7 @@ }, { "cell_type": "markdown", - "id": "97a15ba7", + "id": "97369713", "metadata": {}, "source": [ "### Example\n", @@ -776,22 +660,10 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": null, "id": "4de15781", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[rank 0] I am sending: 20\n", - "[rank 0] I have received: 20\n", - "[rank 1] I have received: 20\n", - "[rank 2] I have received: 20\n", - "[rank 3] I have received: 20\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -813,7 +685,7 @@ }, { "cell_type": "markdown", - "id": "725d8381", + "id": "e83be96d", "metadata": {}, "source": [ "## Communicators\n", @@ -837,7 +709,7 @@ }, { "cell_type": "markdown", - "id": "48b2b85e", + "id": "556ca223", "metadata": {}, "source": [ "## MPI_Comm_dup\n", @@ -858,7 +730,48 @@ }, { "cell_type": "markdown", - "id": "4034e3eb", + "id": "9acfb792", + "metadata": {}, + "source": [ + "### Example\n", + "\n", + "Send value 2 from rank 2 to rank 3. Then send value 1 also from rank 2 to rank 3. Note that we are using 2 different communicators for each send receive pair in such a way that we first receive value 1 and then value 2, even if this not was the other in which the data was sent. Try also to define `comm2 = comm` and see how the result will change." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e50d44f6", + "metadata": {}, + "outputs": [], + "source": [ + "code = quote\n", + " using MPI\n", + " MPI.Init()\n", + " comm = MPI.COMM_WORLD\n", + " # We create a new communicator\n", + " comm2 = MPI.Comm_dup(comm)\n", + " rank = MPI.Comm_rank(comm)\n", + " if rank == 2\n", + " sndbuf = [2]\n", + " MPI.Send(sndbuf, comm2; dest=3, tag=0)\n", + " sndbuf = [1]\n", + " MPI.Send(sndbuf, comm; dest=3, tag=0)\n", + " end\n", + " if rank == 3\n", + " rcvbuf = zeros(Int,1)\n", + " MPI.Recv!(rcvbuf, comm; source=2, tag=0)\n", + " @show rcvbuf\n", + " MPI.Recv!(rcvbuf, comm2; source=2, tag=0)\n", + " @show rcvbuf\n", + " end\n", + "end\n", + "run(`$(mpiexec()) -np 4 julia --project=. -e $code`);" + ] + }, + { + "cell_type": "markdown", + "id": "5e1b13eb", "metadata": {}, "source": [ "## MPI_Comm_split\n", @@ -887,7 +800,7 @@ }, { "cell_type": "markdown", - "id": "947cebc7", + "id": "2b128840", "metadata": {}, "source": [ "### Example\n", @@ -897,21 +810,10 @@ }, { "cell_type": "code", - "execution_count": 87, - "id": "19825efb", + "execution_count": null, + "id": "b18cb74d", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello, I am rank 0 in world and rank 0 in group 0.\n", - "Hello, I am rank 1 in world and rank 0 in group 1.\n", - "Hello, I am rank 2 in world and rank 1 in group 0.\n", - "Hello, I am rank 3 in world and rank 1 in group 1.\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n", @@ -929,7 +831,7 @@ }, { "cell_type": "markdown", - "id": "495775c9", + "id": "b22e4bf4", "metadata": {}, "source": [ "### Example\n", @@ -939,21 +841,10 @@ }, { "cell_type": "code", - "execution_count": 96, - "id": "9abb132e", + "execution_count": null, + "id": "4c0e504b", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[rank 1, newrank 0] I am contributing with [3]\n", - "[rank 3, newrank 1] I am contributing with [3]\n", - "[rank 1, newrank 0] The sum is [6]\n", - "[rank 3, newrank 1] The sum is nothing\n" - ] - } - ], + "outputs": [], "source": [ "code = quote\n", " using MPI\n",