{"id":195,"date":"2018-05-02T00:37:53","date_gmt":"2018-05-01T21:37:53","guid":{"rendered":"http:\/\/talhacelik.com.tr\/?p=195"},"modified":"2018-05-02T00:52:17","modified_gmt":"2018-05-01T21:52:17","slug":"mpi-functions-mpi_send-mpi_recv","status":"publish","type":"post","link":"https:\/\/talhacelik.com.tr\/index.php\/2018\/05\/02\/mpi-functions-mpi_send-mpi_recv\/","title":{"rendered":"MPI Functions (MPI_Send &#038; MPI_Recv)"},"content":{"rendered":"<p>Paralel programlamada processler aras\u0131nda veri\u00a0 al\u0131\u015f-veri\u015fi olduk\u00e7a \u00f6nemlidir. Seri bir halde yaz\u0131lm\u0131\u015f kodu paralel olarak \u00e7al\u0131\u015ft\u0131rabilir duruma getirirken hangi process\u2019in hangi i\u015fi nerede, \u00a0nas\u0131l ve ne \u015fekilde yapaca\u011f\u0131n\u0131 belirlemek gerekmektedir.<\/p>\n<p>Tabii bu i\u015flem \u00f6rnekte de oldu\u011fu gibi manuel olarak yap\u0131lmaktad\u0131r. Fakat t\u00fcretilmi\u015f fonksiyonlarda veri al\u0131\u015f-veri\u015fi otomatik olarak yap\u0131lacakt\u0131r.<\/p>\n<p>MPI k\u00fct\u00fcphanesinin en temel iki fonksiyonu <strong>MPI_Send() ve MPI_Recv()<\/strong> dir. \u0130simlerinden de anla\u015f\u0131laca\u011f\u0131 \u00fczere MPI_Send() datay\u0131 hedefe g\u00f6ndermek amac\u0131 ile kullan\u0131lmakta, MPI_Recv() ise g\u00f6nderilen datan\u0131n al\u0131nmas\u0131n\u0131 sa\u011flamaktad\u0131r.<\/p>\n<pre class=\"highlight\"><code><\/code><code><span class=\"n\">MPI_Send<\/span><span class=\"p\">(<\/span>\r\n    <span class=\"kt\">void<\/span><span class=\"o\">*<\/span> <span class=\"n\">data<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">count<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">MPI_Datatype<\/span> <span class=\"n\">datatype<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">destination<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">tag<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">MPI_Comm<\/span> <span class=\"n\">communicator<\/span><span class=\"p\">)<\/span><\/code><\/pre>\n<pre class=\"highlight\"><code><span class=\"n\">MPI_Recv<\/span><span class=\"p\">(<\/span>\r\n    <span class=\"kt\">void<\/span><span class=\"o\">*<\/span> <span class=\"n\">data<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">count<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">MPI_Datatype<\/span> <span class=\"n\">datatype<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">source<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">tag<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">MPI_Comm<\/span> <span class=\"n\">communicator<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">MPI_Status<\/span><span class=\"o\">*<\/span> <span class=\"n\">status<\/span><span class=\"p\">)<\/span><\/code><\/pre>\n<p>&nbsp;<\/p>\n<p><em>void *data\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 : G\u00f6nderilecek olan veri, RAM \u00fczerindeki adresler ile \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in pointer yap\u0131da.<\/em><\/p>\n<p><em>int count\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0: G\u00f6nderilecek olan verinin adedi.<\/em><\/p>\n<p><em>MPI_Datatype datatype\u00a0 \u00a0 : G\u00f6nderilecek olan verinin tipi.<\/em><\/p>\n<p><em>int destination\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 : Veriyi alacak olan processin numaras\u0131.<\/em><\/p>\n<p><em>int tag\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 : Verinin numaras\u0131. <\/em><\/p>\n<p><em>MPI_Comm \u00a0com\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0: Processlerin i\u00e7inde bulundu\u011fu evren.<\/em><\/p>\n<p><em>\u00a0<\/em><\/p>\n<p>Fonksiyonlar\u0131n parametrelerini okurken anla\u015f\u0131lmas\u0131 zor olan k\u0131s\u0131mlardan biri <strong>MPI_Datatype.\u00a0<\/strong>Bu anahtar kelime ile processler aras\u0131nda dola\u015fan verinin tipini MPI k\u00fct\u00fcphanesinin kendince belirlemi\u015f oldu\u011fu bir veri tipi ile birlikte kullanmak durumunday\u0131z.<\/p>\n<figure id=\"attachment_299\" aria-describedby=\"caption-attachment-299\" style=\"width: 234px\" class=\"wp-caption aligncenter\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-299 size-medium\" src=\"http:\/\/talhacelik.com.tr\/wp-content\/uploads\/2018\/05\/15710583-234x300.jpg\" alt=\"\" width=\"234\" height=\"300\" srcset=\"https:\/\/talhacelik.com.tr\/wp-content\/uploads\/2018\/05\/15710583-234x300.jpg 234w, https:\/\/talhacelik.com.tr\/wp-content\/uploads\/2018\/05\/15710583.jpg 318w\" sizes=\"(max-width: 234px) 100vw, 234px\" \/><figcaption id=\"caption-attachment-299\" class=\"wp-caption-text\"><a href=\"https:\/\/www.amazon.com\/Parallel-Programming-Hard-About-Paperback\/dp\/B00Q6087Q2\/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1525211515&amp;sr=1-1&amp;keywords=Is+Parallel+Programming+Hard%2C+And%2C+If+So%2C+What+Can+You+Do+About+It%3F\">Go to book<\/a><\/figcaption><\/figure>\n<p>MPI K\u00fct\u00fcphanesine ait veri tipleri ve C deki karl\u0131\u015f\u0131klar\u0131<\/p>\n<table>\n<tbody>\n<tr>\n<td>MPI_SHORT<\/td>\n<td>short int<\/td>\n<\/tr>\n<tr>\n<td>MPI_INT<\/td>\n<td>int<\/td>\n<\/tr>\n<tr>\n<td>MPI_LONG<\/td>\n<td>long int<\/td>\n<\/tr>\n<tr>\n<td>MPI_LONG_LONG<\/td>\n<td>long long int<\/td>\n<\/tr>\n<tr>\n<td>MPI_UNSIGNED_CHAR<\/td>\n<td>unsigned char<\/td>\n<\/tr>\n<tr>\n<td>MPI_UNSIGNED_SHORT<\/td>\n<td>unsigned short int<\/td>\n<\/tr>\n<tr>\n<td>MPI_UNSIGNED<\/td>\n<td>unsigned int<\/td>\n<\/tr>\n<tr>\n<td>MPI_UNSIGNED_LONG<\/td>\n<td>unsigned long int<\/td>\n<\/tr>\n<tr>\n<td>MPI_UNSIGNED_LONG_LONG<\/td>\n<td>unsigned long long int<\/td>\n<\/tr>\n<tr>\n<td>MPI_FLOAT<\/td>\n<td>float<\/td>\n<\/tr>\n<tr>\n<td>MPI_DOUBLE<\/td>\n<td>double<\/td>\n<\/tr>\n<tr>\n<td>MPI_LONG_DOUBLE<\/td>\n<td>long double<\/td>\n<\/tr>\n<tr>\n<td>MPI_BYTE<\/td>\n<td>char<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"highlight\">\u00d6rnek olarak 0 ve 1 numaral\u0131 processler aras\u0131nda number de\u011fi\u015fkeninin al\u0131\u015f-veri\u015fini yapan bir C kodu.<\/p>\n<pre class=\"highlight\"><code><span class=\"kt\">int<\/span> <span class=\"n\">world_rank<\/span><span class=\"p\">; \/\/ worker (process) numaras\u0131n\u0131 tutacak de\u011fi\u015fken<\/span>\r\n<span class=\"n\">MPI_Comm_rank<\/span><span class=\"p\">(<\/span><span class=\"n\">MPI_COMM_WORLD<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">world_rank<\/span><span class=\"p\">); \/\/ aktif evrende \u015fuan \u00e7al\u0131\u015fan worker (process) numaras\u0131n\u0131 getirir <\/span>\r\n<span class=\"kt\">int<\/span> <span class=\"n\">world_size<\/span><span class=\"p\">; \/\/ aktif evrende \u00e7al\u0131\u015fan toplam worker (process) say\u0131s\u0131<\/span>\r\n<span class=\"n\">MPI_Comm_size<\/span><span class=\"p\">(<\/span><span class=\"n\">MPI_COMM_WORLD<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">world_size<\/span><span class=\"p\">); \/\/ aktif evrende toplam worker (process) say\u0131s\u0131n\u0131 getirir <\/span>\r\n\r\n<span class=\"kt\">int<\/span> <span class=\"n\">number<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">world_rank<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">number<\/span> <span class=\"o\">=<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">; \/\/ hedef workera (process) g\u00f6nderilecek data<\/span>\r\n    <span class=\"n\">MPI_Send<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"n\">number<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"n\">MPI_INT<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">MPI_COMM_WORLD<\/span><span class=\"p\">); \/\/ 0 numaral\u0131 etikete sahip, 1 adet <em>number<\/em> de\u011fi\u015fkenini 1 numaral\u0131 workera yolla  <\/span>\r\n<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">world_rank<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">MPI_Recv<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"n\">number<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"n\">MPI_INT<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">MPI_COMM_WORLD<\/span><span class=\"p\">,<\/span>\r\n             <span class=\"n\">MPI_STATUS_IGNORE<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Process 1 received number %d from process 0<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span>\r\n           <span class=\"n\">number<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}\r\n\r\n\r\n<\/span><\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Paralel programlamada processler aras\u0131nda veri\u00a0 al\u0131\u015f-veri\u015fi olduk\u00e7a \u00f6nemlidir. Seri bir halde yaz\u0131lm\u0131\u015f kodu paralel olarak \u00e7al\u0131\u015ft\u0131rabilir duruma getirirken hangi process\u2019in hangi i\u015fi nerede, \u00a0nas\u0131l ve ne \u015fekilde yapaca\u011f\u0131n\u0131 belirlemek gerekmektedir. Tabii bu i\u015flem \u00f6rnekte de oldu\u011fu gibi manuel olarak yap\u0131lmaktad\u0131r. Fakat t\u00fcretilmi\u015f fonksiyonlarda veri al\u0131\u015f-veri\u015fi otomatik olarak yap\u0131lacakt\u0131r. MPI k\u00fct\u00fcphanesinin en temel iki fonksiyonu MPI_Send() &hellip;<\/p>\n","protected":false},"author":1,"featured_media":174,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[3,31,30,4],"_links":{"self":[{"href":"https:\/\/talhacelik.com.tr\/index.php\/wp-json\/wp\/v2\/posts\/195"}],"collection":[{"href":"https:\/\/talhacelik.com.tr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/talhacelik.com.tr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/talhacelik.com.tr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/talhacelik.com.tr\/index.php\/wp-json\/wp\/v2\/comments?post=195"}],"version-history":[{"count":18,"href":"https:\/\/talhacelik.com.tr\/index.php\/wp-json\/wp\/v2\/posts\/195\/revisions"}],"predecessor-version":[{"id":301,"href":"https:\/\/talhacelik.com.tr\/index.php\/wp-json\/wp\/v2\/posts\/195\/revisions\/301"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/talhacelik.com.tr\/index.php\/wp-json\/wp\/v2\/media\/174"}],"wp:attachment":[{"href":"https:\/\/talhacelik.com.tr\/index.php\/wp-json\/wp\/v2\/media?parent=195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/talhacelik.com.tr\/index.php\/wp-json\/wp\/v2\/categories?post=195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/talhacelik.com.tr\/index.php\/wp-json\/wp\/v2\/tags?post=195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}