【问题标题】:How to access MySQL from MPI program (use MPICH2)?如何从 MPI 程序访问 MySQL(使用 MPICH2)?
【发布时间】:2012-07-04 09:02:53
【问题描述】:

我有从 MPI 程序(使用 MPICH2)访问的巨大数据库(DBMS = MySQL)。在这个程序中,我只想知道执行 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;
}

提前致谢

【问题讨论】:

  • 这可能是愚蠢的,但我还是要问...你有localhost作为你的服务器名称。以mpiexec 开始的进程是否也在localhost 上运行,或者它们是否被发送到某些后端计算节点?
  • 是的,我使用 localhost 作为我的 mysql 服务器。是的,我只在本地主机上尝试(只有 1 台 PC)。
  • 您能尝试删除main() 末尾的getchar() 调用吗?控制台输入不能很好地与 MPI 配合使用。

标签: c++ mysql parallel-processing mpi mpich


【解决方案1】:

我建议如下:

  1. 添加以下内容以查看您是否在 MPI 框架中运行 really

    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 作为所有日志语句的一部分,以便识别打印语句从哪个 MPI 子进程开始。

2 。为了确定,我宁愿检查mysql_init(&amp;mysql);的返回类型

3 .出于调试目的,您可以在MPI_Init() 调用之后添加getchar(),以便启动两个进程(假设mpirun/mpiexec 进程数参数为2)。然后,您可以在 MVS attach debugger 窗口中看到两个进程的进程 ID。然后,您可以将调试器附加到其中一个 MPI 子进程,并查看给定 mpi 子进程的 sql 查询执行失败的原因。

4 。不知道为什么需要在 for 循环中打开/关闭 sql socket。 ?它可以在for 循环之外。

5 .交叉检查您的程序是否真的与适当的 mpi lib 链接。

【讨论】:

  • 您好 Jay D,感谢您的回答。我的程序与 mpi 库有链接。我需要知道访问数据库所需的总时间,即在循环内打开/关闭 sql 套接字。现在我尝试简单的程序(由 mpiexec 执行)。在它被 mysql_init() 添加之前,一切运行良好。但是添加后,输出为空白。
  • 这是简单的代码:#include #include #include #include #include #include int main(int argc, char *argv[]){ int proc,id; 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; }
  • 试试这个:#include &lt;stdio.h&gt; #include &lt;mpi.h&gt; #include &lt;windows.h&gt; #include &lt;mysql.h&gt; #include &lt;iostream&gt; #include &lt;winsock.h&gt; int main(int argc, char *argv[]) { int proc,id, mysqlretval = 0; MYSQL mysql; MPI_Init(&amp;argc,&amp;argv); MPI_Comm_rank(MPI_COMM_WORLD, &amp;id); MPI_Comm_size(MPI_COMM_WORLD, &amp;proc); printf("Sql Init from proc %d out of %d!\n", id, proc); fflush(stdout); getchar(); mysqlretval = mysql_init(&amp;mysql); printf("Sql Init returned %d from proc %d out of %d!\n", mysqlretval, id, proc); fflush(stdout); MPI_Finalize(); return 0; }
  • mysql_init() 有 'MYSQL *' 返回值,所以我们不能保存成整数。如果我改变 mysqlretval 类型,它是一样的。该程序在visual studio中运行良好/只需双击可执行文件而不是mpiexec。
  • 对不起,我错过了返回值。然后我们需要检查返回值是否为null。我强烈怀疑是null
【解决方案2】:
  1. 我们可以同时使用 mysql 和 mpi 库,这是真的。
  2. 在这个问题上,可能会导致大量数据(但我不确定)。可能用于保存 mysql 查询数据的 MYSQL_RES 的大小不够。

【讨论】:

    猜你喜欢
    • 2012-01-11
    • 2012-12-12
    • 1970-01-01
    • 2012-02-01
    • 2014-09-16
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多