前提・実現したいこと
ここに質問の内容を詳しく書いてください。
現在、 MPIによる並列処理で素数を求めるプログラムを作成しています。
入力した数までの素数を全て表示させて、その素数の数を表示したいです。
それを並列処理を行い、数を分配させて計算させようとしています。
発生している問題・エラーメッセージ
mpiexec -n 4(プロセス数) monk(プログラム名)
と実行したところ、素数以外の数が出てしまいます。
また、プロセス数を2にすると、素数のみが出ますが、
素数を数えるところの表示を見ると、うまく分配できていないみたいです。
素数の数も数えたいのですが、分配すると答えがそれぞれの計算した数を表示する形になってしまい、
うまく表示できません。
よろしくお願いします。
該当のソースコード
C言語です。 環境はLinuxです。
ソースコード
#include <mpi.h> #include <math.h> #include<stdio.h> int main(int argc, char*argv[]) { int n, rank, length, numprocs, i, j, k; int kosu = 0; char hostname[MPI_MAX_PROCESSOR_NAME]; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Get_processor_name(hostname, &length); if (rank == 0) { printf("\n"); printf("###############"); printf("\n\n"); printf("3以上の整数を入力してください。\n"); printf("\n") printf("%d", &n); printf("\n"); } MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); for(i = rank + 2; i <= n; i += numprocs) //ここでラズベリーパイに数字を分割しています。 { j = 0; for(k = rank + 2; k <= n; k += numprocs) { if(i % k == 0 && i != k) { j++; break; } } if(j == 0) { kosu++; printf("\n"); printf("%d \n", i); } } MPI_Finalize(); printf("2から%dの間にある素数の数は%d個である。\n", n, kosu); return 0; }
試したこと
答えをMPI_GatherやMPI_Reduceなどでまとめようとしたのですが、
うまくいきませんでした。変に大きな数字がでるだけになってしまいました。
補足情報(FW/ツールのバージョンなど)
ラズベリーパイを並列接続して並列処理を行おうとしています。
よろしくお願いします。
できれば、計算にかかった時間も表示させられるとありがたいです。
よろしくお願いします。
あなたの回答
tips
プレビュー