2

MPIプログラム(MPICH2を使用)からアクセスする巨大なデータベース(DBMS = MySQL)があります。このプログラムでは、SQLクエリを実行する時間について知りたいだけです。それは私の他の並列プログラムへの参照です。

コードをVisualStudioC ++から実行すると、正常に実行されます(出力が得られます)。ただし、useを実行するmpiexecと、出力もエラーメッセージも表示されません。それ以外の場合、単純なプログラム(mysqlコードなし、mpiexecを使用)を試してみると、正常に実行されます(出力があります)。mysqlライブラリとmpiライブラリを一緒に使用するべきではありませんか?

このようなコード:

#include <stdio.h>
#include <windows.h>
#include <mysql.h>
#include <iostream>
#include <winsock.h>
#include <mpi.h>
#include <stdlib.h>

using namespace std;

//namespace for error handling
namespace ekception{
        struct error{
        const char *p;
        error(const char *q){
        p=q;
        }
    };
}

int main(int argc, char *argv[]){
    MYSQL mysql,*sock;
    MYSQL_RES *res;
    int state;
    char *host="localhost";
    char *user="root";
    char *password="";
    char *dbName="sp";
    double start,finish,time;
    long j;
    char s[]="SELECT COUNT(kolom2) FROM coba WHERE kolom1<=";
    char query[BUFSIZ];

    MPI_Init(&argc,&argv);

    for(j=250000;j<=25000000;j+=250000){
    sprintf_s(query,"%s%d",s,j);
    start=MPI_Wtime();
    try{
        mysql_init(&mysql); 
        if(!(sock=mysql_real_connect(&mysql,host,user,password,dbName,0,NULL,0))){
            throw ekception::error("Connection failed\n");
        }
        mysql.reconnect=1;

        state=mysql_query(sock,query);

        if(state!=0){
            throw ekception::error("Query execution Failed\n");
        }

        res=mysql_store_result(sock);
        mysql_free_result(res);
        mysql_close(sock);
    }

    catch(ekception::error e){
        printf("%s\n",e.p);
    }

    finish=MPI_Wtime();
    time=finish-start;
    printf("Data size = %d *** time = %f\n",j,time);
}

MPI_Finalize();
getchar();
return 0;
}

前もって感謝します

4

2 に答える 2

0
  1. mysql と mpi ライブラリを一緒に使用できます。
  2. この問題で、巨大なデータが発生した可能性があります(ただし、それについてはわかりません)。おそらく、mysql クエリからの保存データに使用される MYSQL_RES のサイズが十分ではありません。
于 2012-09-19T20:45:06.570 に答える
0

私は次のことをお勧めします:

  1. really以下を追加して、MPI フレームワークで実行しているかどうかを確認します。

    int id, nprocs;
    
    MPI_Comm_rank(MPI_COMM_WORLD, &id);
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
    
    printf("Sql Init from proc %d out of %d!\n", id, nprocs);
    

すべてのログ ステートメントの一部としてランク ID を出力して、print ステートメントがどの MPI 子プロセスから開始されているかを識別します。

2. 念のため、戻り値の型を確認したいと思いますmysql_init(&mysql);

3. デバッグの目的でgetchar()、呼び出しの直後にを追加して、両方のプロセス (プロセス数の引数が 2 であるとMPI_Init()仮定) が起動されるようにすることができます。mpirun/mpiexec次に、MVSattach debuggerウィンドウで、両方のプロセスのプロセス ID を確認できます。sql次に、デバッガーを MPI 子プロセスの 1 つに接続し、特定の mpi 子プロセスのクエリ実行で何が失敗したかを確認できます。

4 . sql socketforループ内を開閉する必要がある理由がわかりません。? forループの外にある可能性があります。

5. プログラムが本当に適切な mpi lib とリンクしているかどうかをクロスチェックしてください。

于 2012-07-04T00:56:30.623 に答える