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

У меня есть огромная база данных (СУБД = 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. да, я пробую только на локальном хосте (всего 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.

person Jay D    schedule 04.07.2012
comment
Привет Джей Д, спасибо за ваш ответ. моя программа имеет ссылку на библиотеку mpi. Мне нужно знать общее время, необходимое для доступа к базе данных, чтобы открыть/закрыть сокет sql внутри цикла. Теперь я пробую простую программу (исполняется mpiexec). До того, как он был добавлен с помощью mysql_init(), все работало хорошо. Но когда он добавлен, вывод пуст. - person titia; 04.07.2012
comment
это простой код: 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 from proc %d out of %d!\n, id, proc); mysql_init(&mysql); MPI_Finalize(); получитьсимвол(); вернуть 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, это не ноль. - person titia; 05.07.2012

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