c++ - 如何从 MPI 程序访问 MySQL(使用 MPICH2)?

标签 c++ mysql parallel-processing mpi mpich

我有一个巨大的数据库 (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;
}

提前致谢

最佳答案

我建议如下:

  1. 添加以下内容以查看您是否真的在 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 作为所有日志语句的一部分,以便识别打印语句从哪个 MPI 子进程开始。

2。只是为了确定,我宁愿检查 mysql_init(&mysql);

的返回类型

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

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

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

关于c++ - 如何从 MPI 程序访问 MySQL(使用 MPICH2)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11319248/

相关文章:

mysql - 获取满足SQL中最左条件的第一条记录

MySQL 按 SUM 分组

c - 为什么在 Petersons 算法中需要内存栅栏

c++ - c++ : "Expected primary expression before ` >` token" 中的模板问题

c++ - 在 C++ 中怎么可能有一个字符串数组?

php - 从 Laravel 框架创建一个在线用户(问题)

c++ - RcppParallel 中如何调用自定义函数?

c# - .NET MPI 实现?

c++ - 路径如何存储在这种结构中,以及如何将其转换为其他结构?

C++ 列表初始化允许多个用户定义的转换