我有一个巨大的数据库 (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;
}
提前致谢
最佳答案
我建议如下:
添加以下内容以查看您是否
真的
在 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/