如何在MPI中为多个进程创建结构

How to create structs for multiple processes in MPI

本文关键字:进程 创建 结构 MPI      更新时间:2024-09-27

我是MPI编码的初学者。我希望有跨多个进程的结构。

我有一个计数最小草图的结构:

typedef struct CM_type{
long long count;
int depth;
int width;
int ** counts;
unsigned int *hasha, *hashb;
} CM_type;

我写了一个函数来初始化这个计数分钟草图。

std::vector<CM_type> CM_Init(int width, int depth, int seed)
{
int j;
prng_type * prng;
prng=prng_Init(-abs(seed),2); 
#pragma omp parallel shared (width, depth, prng) private(j)
{

//CM_type cm_loc;
std::vector<CM_type> cm_loc;
//std::vector<CM_type> cm_loc;
cm_loc.depth=depth;
cm_loc.width=width;
cm_loc.count=0;
cm_loc.counts=(int **)calloc(sizeof(int *),cm_loc.width);
cm_loc.counts=(int *)calloc(sizeof(int), cm_loc.depth*cm_loc.width);
//cm->total = 0;
cm_loc.hasha=(unsigned int *)calloc(sizeof(unsigned int),cm_loc.depth);
cm_loc.hashb=(unsigned int *)calloc(sizeof(unsigned int),cm_loc.depth);
if (cm_loc.counts && cm_loc.hasha && cm_loc.hashb && cm_loc.counts[0])
{
for (j=0;j<depth;j++)
{
#pragma omp critical
{
cm_loc.hasha[j]=prng_int(prng) & MOD;
cm_loc.hashb[j]=prng_int(prng) & MOD;
// pick the hash functions
cm_loc.counts[j]=(int *) cm_loc.counts[0]+(j*cm_loc.width);
}
}
}
//else cm_loc = NULL;
return cm_loc[0];

}  
}   

我的目标是在多个过程中创建局部计数最小草图,然后独立初始化局部草图。当我运行这个代码时,我会得到这样的错误:

error: 'class std::vector<CM_type>' has no member named 'depth'
cm_loc.depth=depth;
^~~~~
error: 'class std::vector<CM_type>' has no member named 'width'
cm_loc.width=width;

等等。对于所有的结构成员,我都会遇到这个错误。如果需要,我可以给你更多的信息。请帮忙。非常感谢。

请阅读MPI上的几乎所有内容。您想要做的是琐碎的,因为MPI的工作方式是,所有主程序都是独立输入的,所有MPI进程都是独立的,不共享其地址空间的任何部分。(除非您使用更高级的功能来实现这一点(。因此,像这样的代码(未编译:-((做你想要的:

int main(int argc, char **argv) {
myType var;   // one in each process!
MPI_Init(...);
.. operate on the local var ...
MPI_Allreduce (passing var and so on);
}

不需要OpenMP,这只会使您的示例变得复杂。表明你的问题发生了"当我运行这个代码时";,然后显示编译时错误也没有什么帮助。

正如其他人所指出的,您的直接问题是您的C++代码与MPI或其他任何东西无关!