質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MPI

MPIは、並列プログラミングを利用するための標準化規格、及び実装自体のことを指します。バイト列で構成されたメッセージとして、いくつかのCPUが情報を送受信することにより協調動作を可能にします。

並列処理

複数の計算が同時に実行される手法

Q&A

1回答

798閲覧

c言語で、送受信を並列に行うプログラムを作成したい

kn1153

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MPI

MPIは、並列プログラミングを利用するための標準化規格、及び実装自体のことを指します。バイト列で構成されたメッセージとして、いくつかのCPUが情報を送受信することにより協調動作を可能にします。

並列処理

複数の計算が同時に実行される手法

0グッド

0クリップ

投稿2022/01/03 13:13

実現したいこと

2000要素のint型の一次元配列を、先頭から200要素単位で10個に分けて、各200個の配列を作成したいです。Rank0は各要素を0で初期化します。

詳細は以下の通りです。
・MPI_Recvで[自身のランク-1]のプロセスから200要素の配列を受信(Rank0は例外)
・200個の要素全てに自身のランク番号を加算
・加算した200個の要素を[自身のランク+1]のプロセスにMPI_Isendで送信(Rank n-1は例外)
・次の200個の要素に上記の処理を繰り返す
・末尾のランクは自身のランクを加算した後に0番目の要素を出力

イメージ図

イメージ説明

イメージ説明

下記のソースコードは「全データを受信して、加算した後に、全データを送信する」ものですが、コードを書き換えて「200個の配列に分割して並列に送受信」を行いたいです。どのように書き換えればよろしいでしょうか?

該当のソースコード

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <mpi.h> 4 5int main(int argc, char** argv){ 6 MPI_Init(&argc, &argv); 7 int rank, size; 8 MPI_Comm_rank(MPI_COMM_WORLD, &rank); 9 MPI_Comm_size(MPI_COMM_WORLD, &size); 10 int* buffer = (int*)malloc(sizeof(int)*2000); 11 12 if (rank == 0){ 13 for (int i=0; i<2000; i++){ 14 buffer[i] = 0; 15 } 16 } 17 /*自身の前のrankから受信*/ 18 if(rank != 0){ 19 MPI_Recv( buffer, 2000, MPI_INT, rank-1, 0, MPI_COMM_WORLD, NULL); 20 } 21 /*対象のバッファに対してrank番号を加算*/ 22 for (int i=0; i<2000; i++){ 23 buffer[i] += rank; 24 } 25 /*自身の次のrankへ送信*/ 26 if(rank != size - 1){ 27 MPI_Send( buffer, 2000, MPI_INT, rank+1, 0, MPI_COMM_WORLD); 28 } 29 if (rank == size-1){ 30 printf("buffer[0] is %d\n", buffer[0]); 31 } 32 MPI_Finalize(); 33 return 0; 34} 35

補足情報(FW/ツールのバージョンなど)

・言語:c言語
・コマンド:cygwin
・コンパイラ:mpicc
・MPI用のランチャー:mpirun

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

そもそもの考え方がおかしいです
分割して受信して処理する必要があるなら、その分割した単位で送信するようにしましょう。
必ず一つの単位として一つのメッセージを受信し、それのレスポンスを送信する、ということを行いましょう。

通信途中のメッセージを取り込んでどーこー、ということは行いません

投稿2022/01/03 14:52

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2022/01/03 23:28

> 分割して受信して処理する必要があるなら、その分割した単位で送信するようにしましょう。 そのコードが質問者さん自身で書けないので、「どう書き直したらいいですか?」と言う質問ですね。 (どう書き直したら、という時点で丸投げ相当ですが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問