• 締切済み

MPIプログラムの実行でエラーが出てしまいます

エラストテネスのふるいのプログラムなんですが、どうもエラーが出て実行できません。 他の部分などを直して、なんとかエラーをひとつにしたんですが、どうも#include "MyMPI.h"に関連する部分でミスがあってできないようなのです。 エラーの内容は文字化けしているので読めません。 どなたかお教えしてもらえないでしょうか。 #include<mpi.h> #include<math.h> #include<stdio.h> #include "MyMPI.h" #define MIN(a,b) ((a)<(b)?(a):(b)) int main(int argc, char *argv[]) { int count; double elapsed_time; int first; int global_count; int high_value; int i; int id; int index; int low_value; char *marked; int n; int p; int proc0_size; int prime; int size; MPI_Init(&argc, &argv); MPI_Barrier(MPI_COMM_WORLD); elapsed_time = -MPI_Wtime(); MPI_Comm_rank (MPI_COMM_WORLD,&id); MPI_Comm_size (MPI_COMM_WORLD,&p); if (argc != 2) { if (!id) printf("Command line: %s <m>\n", argv[0]); MPI_Finalize(); exit(1); } n = atoi(argv[1]); low_value = 2 + BLOCK_LOW(id,p,n-1); high_value = 2 + BLOCK_HIGH(id,p,n-1); size = BLOCK_SIZE(id,p,n-1); proc0_size = (n-1)/p; if ((2 + proc0_size) < (int) sqrt((double) n)) { if (!id) printf("Too many processes\n"); MPI_Finalize(); exit (1); } marked = (char *) malloc (size); if (marked == NULL) { printf("Cannot allocate enough memory\n"); MPI_Finalize(); exit(1); } for (i = 0; i < size; i++) marked[i] = 0; if (!id) index = 0; prime = 2; do { if (prime * prime > low_value) first = prime * prime - low_value; else { if (!(low_value % prime)) first = 0; else first = prime - (low_value % prime); } for (i = first; i < size; i += prime) marked[i] = 1; if (!id) { while (marked[++index]); prime = index + 2; } MPI_Bcast (&prime, 1, MPI_INT, 0, MPI_COMM_WORLD); } while (prime * prime <= n); count = 0; for (i = 0; i < size; i++) if (!marked[i]) count++; MPI_Reduce (&count, &global_count, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); elapsed_time += MPI_Wtime(); if (!id) { printf("%d primes are less than or equal to %d\n",global_count, n); printf("Total elapsed time: %10.6f\n", elapsed_time); } MPI_Finalize(); return 0; }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

本題とは関係ないけど, タイトルで「実行でエラーが出てしまいます」といっているのに本文中で「どうもエラーが出て実行できません」といっているのはおかしいです. 「コンパイルはできるけど実行時にエラーになる」のか, 「コンパイルができない (ので当然実行もできない)」のか, どちらなんでしょうか? 「コンパイルできない」のなら, 「文字化けしない環境」を何とかして作ってください. あと, 処理系くらい書いてくれないかなぁ.

関連するQ&A

  • MPIを用いた並列計算における3次元配列の通信に関して

    以下のプログラムで,ランク0の3次元配列rec_f[][][]に,ランクpの3次元配列id[][][]を,要素ごとではなく,そのままコピーすることを考えています. しかし,途中出力したid[6][24][3]とrec_f[6][24][3]が異なる値になってしまい,その理由が分かりません. 宜しければ,原因と修正箇所をご教示頂けないでしょうか. 宜しくお願い致します. if(my_rank != 0) { MPI_Isend(id, lx * my * mz, MPI_INT,    dest, 0, MPI_COMM_WORLD, &request); if(my_rank == 2) cout << id[6][24][3] << " "; } else {   for(i = 1; i < lx - 1; i ++) {  for(p = 1; p <= p_num-1; p++)   {   source = p;   MPI_Irecv(rec_f, lx * my * mz, MPI_INT, source, 0,                      MPI_COMM_WORLD, &request);  if(p == 2) cout << rec_f[6][24][3] << " ";   } } MPI_Wait(&request,&status);

  • プログラムを組んだのにエラーが出る!!!

    #include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { int i, j; int m, flag, count; FILE *fp; if (NULL == (fp = fopen("prime.txt", "w"))) { printf("Cannot open output file\n"); exit(1); } count = 0; for (i = 2; i < 1000; i++) { m =sqrt(i); flag = 1; for (j = 2; j <= m; j++) { if (i % j == 0) { flag = 0; break; } count++; } if (flag) { printf("%4d ", i); fprintf(fp," %4d", i); } } printf("\n乗除回数:%d\n", count); fprintf(fp,"\n乗除回数 %d\n", count); fclose(fp); return 0; } (通常課題2-3 1000以下の正の整数値のうち,素数をすべて計算し,結果をファイルに格納するプログラムを作れ. .また、計算の実行の中で乗除を行った回数もあわせて表示し、ファイルに格納すること 実行結果 2 3 5 7 11 13 17 … 991 997 乗除回数:78022 どこが間違ってるのか指摘してください お願いします!

  • MPI

    MPIのエラーメッセージの意味がわからないので質問します。 エラーメッセージは以下の通りです。 ----------------------------------------------------------------------------------------- [cli_1]: aborting job: Fatal error in MPI_Send: Other MPI error, error stack: MPI_Send(172).............................: MPI_Send(buf=0x80e557c, count=26, MPI_INT, dest=2, tag=0, MPI_COMM_WORLD) failed MPIDI_CH3_Progress_wait(199)..............: an error occurred while handling an event returned by MPIDU_Sock_Wait() MPIDI_CH3I_Progress_handle_sock_event(436): MPIDI_CH3U_Handle_recv_pkt(247)...........: failure occurred while allocating memory for a request object rank 1 in job 258 cs080_12340 caused collective abort of all ranks exit status of rank 1: killed by signal 9 [cli_0]: aborting job: Fatal error in MPI_Send: Other MPI error, error stack: MPI_Send(172).............................: MPI_Send(buf=0x80e557c, count=26, MPI_INT, dest=1, tag=0, MPI_COMM_WORLD) failed MPIDI_CH3_Progress_wait(199)..............: an error occurred while handling an event returned by MPIDU_Sock_Wait() MPIDI_CH3I_Progress_handle_sock_event(777): MPIDU_Socki_handle_pollhup(418)...........: connection closed by peer (set=0,sock=1) ----------------------------------------------------------------------------------------- これはやはりメモリ関係のエラーなのでしょうか? 詳しい方、知っている方がいましたら教えてください。 よろしくお願いします。

  • C言語<素数を求めるプログラム>

    #include<stdio.h> int j; int prime(int n) { int i; if(n < 2) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } return 1; } int main(void) { int n; for(n=1; n <= 1000; n++) { if(prime(n)){ printf("%d\n",n); j++; } } printf("素数の個数は全部で %d 件見つかりました。\n",j); return 0; } このプログラムは1から1000までの素数のみを表示させるプログラムでありますが、このアルゴリズムが全くわかりません。 int prime(int n)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?

  • 入力された2つの整数の差を絶対値を出力するプログラム

    2整数の差を絶対値を出力するプログラムをつくりました. 入力される数値は、正数の場合は最大8桁まで有効とし、9桁目以降を無視、負数の場合は '-'を含め、最大9桁まで有効とし,10桁目以降を無視するようにしたい。 2番目の数値入力で9桁以降に数字以外の文字を入力すると,うまく動きません.なぜ動かないかとどのように直したらよいか教えてください. お願いします. #include <stdio.h> #include <stdlib.h> #define BUFFERSIZE 10 #define PLUS_MAX 8 #define MINUS_MAX 9 #define C_NULL ('\0') #define RC_OK 0 #define RC_ND -1 #define RC_ID -2 #define RC_MD -3 int absolute( int n1, int n2 ) ; main() { char n[ 2 ][ BUFFERSIZE ]; int i ; int a[ 2 ] ; int ab ; int count ; int n_pos ; char c ; for( i = 0 ; i < 2 ; i ++ ){ printf( "%d番目の数値 :", i + 1 ) ; for( count = 0 ; count <= BUFFERSIZE ; count ++ ){ c = getchar() ; if( c >= '0' && c <= '9' || count == 0 && c == '-' ){ n[i][ count ] = c ; continue ; } if( c == '\n' ) break ; printf( "Error!\n" ) ; return( RC_ID ) ; } if( count == 0 ){ printf("Error!\n"); return( RC_ND ); } else if( n[ i ][ 0 ] == '-' && count < 2 ){ printf("Error!\n"); return( RC_ID ) ; } if( n[ i ][ 0 ] == '-' && count > MINUS_MAX ){ n_pos = MINUS_MAX ; }else{ if( count > PLUS_MAX ){ n_pos = PLUS_MAX ; }else{ n_pos = count ; } } n[ i ][ n_pos ] = '\0' ; a[ i ] = atoi( n[ i ] ) ; } ab = absolute( a[ 0 ], a[ 1 ] ) ; printf( "絶対値は %d \n", ab ) ; return( RC_OK ); } int absolute(int n1, int n2) { int i ; i = n1 - n2 ; return i >= 0 ? i : -i ; }

  • プログラムの違いを教えて下さい・・・

    public class Gold1 { static int prime(int number){ int count=0; for(int i=2; i<number; i+=2){ if(number%i==0) count++; } return count; } public static void main(String[] args) { long start = System.currentTimeMillis(); int n, p; //System.out.println("4=2+2"); for(n=6; n<=100000; n+=2){ for(p=2; p<n; p++){ if(prime(p)==2 && prime(n-p)==2){ //System.out.println(n + "=" + p + "+" + (n-p)); break; } } if(p==n){ //System.out.println("この予想は間違いと判明!"); break; } if(n%1000==0){ long stop = System.currentTimeMillis(); System.out.println(n + " " + (stop-start)); } } } } ---------------------------------------------------------------- この上のプログラムの一部を ---------------------------------------------------------------- if(prime(p)==0 && prime(n-p)==0){ //System.out.println(n + "=" + p + "+" + (n-p)); break; } ---------------------------------------------------------------- というふうに変えたらどういう意味があるのですか??

    • ベストアンサー
    • Java
  • 最頻度のプログラム

    以下のような最頻度のプログラムを作成しました.最頻度が1つしか存在しないような場合はうまく動くと思います.しかし最頻度の数字が2つ以上存在すると,一番はじめに書い最頻度の数字しか表示しないと思います.どう改良すれば,すべての最頻度の数字を拾ってくれますかね. /*最頻値を求めるプログラム*/ #include<stdio.h> int main(void) { int i,j; int count=0,COUNT=0; double num[20]; double max; printf("最頻値を求めます.数字を20個入力してください.\n"); for(i=0;i<20;i++) { printf("%d\t",i+1); scanf("%lf",&num[i]); } for(i=0;i<20;i++) { count=0; for(j=i+1;j<20;j++) { if(num[i]==num[j]) { count++; } if(COUNT<count-1) { COUNT=count; max=num[i]; } } } printf("%lfが最頻値です.\n",max); return 0; }

  • クイックソートのプログラムを実行するとエラーが出る

    プログラミング初心者のものです。 ソースのファイル名はquicksortという名前にして、コンパイル&実行すると、 「Quicksortが原因でQUICKSORT.EXEにエラーが発生しました。Quicksortは終了します。問題が解決しない場合は、コンピュータを再起動してください。」 と、 「Quicksortが原因でKERNEL32.DLLにエラーが発生しました。Quicksortは終了します。問題が解決しない場合は、コンピュータを再起動してください。」 と言うエラーが出てきて最後まで実行されません。 どうしてでしょうか?ちなみにソースは以下のものです。 #include<stdio.h> #define N 10 void quicksort(int a[],int first,int last) { int i,j,p,w,k; k=(first+last)/2; p=a[k]; i=first; j=last; while(i<=j){ while(a[i]<p){ i++; } while(a[j]>p){ j--; } w=a[i]; a[i]=a[j]; a[j]=w; i++; j--; } if(first>j){ quicksort(a,first,j); } if(last>i){ quicksort(a,i,last); } } main() { int a[]={18,97,59,72,5,38,11,43,67,26}; int i; printf("Before:"); for(i=0;i<N;i++){ printf("%4d",a[i]); } printf("\n"); quicksort(a,0,N-1); printf("After:"); for(i=0;i<N;i++){ printf("%4d",a[i]); } printf("\n"); return(0); }

  • ゴールドバッハの予想についてのプログラムなんですが・・・

     ゴールドバッハの予想(4以上の任意の偶数は,2つの素数の和で表せる)を表すJavaプログラムです。 ---------------------------------------------------------------- public class Gold { static int prime(int number){ int count=0; for(int i=1; i<=number; i+=2){ if(number%i==0) count++; } return count; } public static void main(String[] args) { long start = System.currentTimeMillis(); int n, p; //System.out.println("4=2+2"); for(n=6; n<100000; n+=2){ for(p=2; p<n; p++){ if(prime(p)==2 && prime(n-p)==2){ //System.out.println(n + "=" + p + "+" + (n-p)); break; } } if(p==n){ //System.out.println("この予想は間違いと判明!"); break; } if(n%1000==0){ long stop = System.currentTimeMillis(); System.out.println(n + " " + (stop-start)); } } } } ---------------------------------------------------------------- 『for(int i=1; i<=number; i++){ のループ、number まで回しているのが無駄である。素数判定は 2 以上、√number 以下の整数で割り切れれば素数でないのでループの上限は√number で良い。number まで回す必要はなく、i で割り切れた時点で prime=1 として 飛び出せばよい。ループを回り終わっても割り切れていなければ prime=2 で出る。』というコメントを、上に書いたプログラムを変更して表すにはどうしたら良いのですか?? 誰か教えて下さい(*_*) お願いします★

    • ベストアンサー
    • Java
  • エラーがどこかわからない

    #include<stdio.h> #include<math.h> #define NUM 100000 int main(void){ int prime[NUM+1],i,j,Limit; for(i=2;i<=NUM;i++){ prime[i]=1; } Limit=(int)sqrt(NUM); for(i=2;i<=Limit;i++){ if(prime[i]==1){ for(j=2*i;j<=NUM;j+=i){ prime[j]=0; } } } for ( i=2;i<=NUM;i++) {  if (prime[i]){    printf("%d\n",i); } } }  これは100000未満の素数の総数を求めるプログラムなんですが、実行したらエラーが出てくるんです。何度も確認しても正しいはずなんですがエラー出てきて困っています。どこが間違っているでしょうか?