gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:59:33 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com