Как да получите достъп до MySQL от MPI програма (използвайте MPICH2)?

Имам огромна база данни (DBMS = MySQL), до която имам достъп от MPI програма (използвайки MPICH2). В тази програма просто искам да знам за времето за изпълнение на sql заявка. Това е препратка към другата ми паралелна програма.

Когато кодът се изпълнява от Visual Studio C++, той работи добре (получавам резултата). Но когато се стартира, използвайте 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;
}

Благодаря предварително


person titia    schedule 03.07.2012    source източник
comment
Това може да е глупаво, но все пак трябва да попитам... Имате localhost като име на вашия сървър. Процесите, стартирани с mpiexec, изпълняват ли се и на localhost или се изпращат до някои бекенд изчислителни възли?   -  person Hristo Iliev    schedule 04.07.2012
comment
да, използвам localhost като мой mysql сървър. да, пробвам го само на localhost (само 1 компютър).   -  person titia    schedule 05.07.2012
comment
Бихте ли опитали да премахнете обаждането getchar() в края на main()? Конзолният вход не работи добре с MPI.   -  person Hristo Iliev    schedule 06.07.2012


Отговори (2)


Бих предложил следното:

  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);
    

Бих отпечатал идентификационния номер на ранга като част от всички ваши отчети за журнал, за да идентифицирам от кой MPI дъщерен процес започва операторът за печат.

2 . Само за да съм сигурен, предпочитам да проверя типа на връщане на mysql_init(&mysql);

3 . за целите на отстраняването на грешки можете да добавите getchar() точно след извикването MPI_Init(), така че и двата процеса (ако приемем, че аргументът mpirun/mpiexec брой процеси е 2) да бъдат стартирани. След това можете да видите в прозореца MVS attach debugger идентификаторите на процеса и на двата процеса. След това можете да прикачите дебъгер към един от дъщерните процеси на MPI и да видите какво се проваля при изпълнението на sql заявката за даден дъщерен процес на mpi.

4 . не съм сигурен защо трябва да отваряте/затваряте sql socket във вашия for цикъл. ? може да е извън цикъла for.

5. проверете дали вашата програма наистина се свързва с подходяща mpi lib.

person Jay D    schedule 04.07.2012
comment
Здравей Джей Д, благодаря ти за отговора. моята програма има връзка с mpi библиотека. Трябва да знам общото време, необходимо за достъп до базата данни, което отваря/затваря sql сокет в рамките на цикъл. Сега опитвам проста програма (изпълнена от mpiexec). Преди да бъде добавен от mysql_init(), всичко работи добре. Но когато се добави, изходът е празен. - person titia; 04.07.2012
comment
това е простият код: #include ‹stdio.h› #include ‹mpi.h› #include ‹windows.h› #include ‹mysql.h› #include ‹iostream› #include ‹winsock.h› int main(int argc, char *argv[]){ int proc,id; MYSQL mysql; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD, &id); MPI_Comm_size(MPI_COMM_WORLD, &proc); printf(Sql Init от proc %d от %d!\n, id, proc); mysql_init(&mysql); MPI_Finalize(); getchar(); връщане 0; } - person titia; 04.07.2012
comment
опитайте това: #include <stdio.h> #include <mpi.h> #include <windows.h> #include <mysql.h> #include <iostream> #include <winsock.h> int main(int argc, char *argv[]) { int proc,id, mysqlretval = 0; MYSQL mysql; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD, &id); MPI_Comm_size(MPI_COMM_WORLD, &proc); printf("Sql Init from proc %d out of %d!\n", id, proc); fflush(stdout); getchar(); mysqlretval = mysql_init(&mysql); printf("Sql Init returned %d from proc %d out of %d!\n", mysqlretval, id, proc); fflush(stdout); MPI_Finalize(); return 0; } - person Jay D; 04.07.2012
comment
mysql_init() има върната стойност 'MYSQL *', така че не можем да запишем в цяло число. Ако променя типа mysqlretval, той е същият. програмата работи добре от Visual Studio/просто щракнете два пъти върху изпълнимия файл, но не и от mpiexec. ‹Наистина не знам какво не е наред› - person titia; 04.07.2012
comment
съжалявам, пропуснах върнатата стойност. тогава трябва да проверим дали върнатата стойност е null. силно подозирам, че е null - person Jay D; 05.07.2012
comment
когато отпечатам mysqlretval, няма null. - person titia; 05.07.2012

  1. Можем да използваме mysql и mpi библиотеката заедно, това е вярно.
  2. При този проблем може би са причинени огромни данни (но не съм сигурен за това). Може би размерът на MYSQL_RES, който се използва за запазване на данни от mysql заявка, не е достатъчен.
person titia    schedule 19.09.2012