【发布时间】:2021-02-24 01:36:42
【问题描述】:
我是 MPI 编码的初学者。我想拥有跨多个进程的结构。
我有一个 count min 草图的结构:
typedef struct CM_type{
long long count;
int depth;
int width;
int ** counts;
unsigned int *hasha, *hashb;
} CM_type;
我写了一个函数来初始化这个 count min 草图。
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];
}
}
我的目标是创建跨多个进程的本地 count min 草图,然后独立初始化本地草图。当我运行此代码时,我收到如下错误:
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;
等等。对于所有结构成员,我都收到此错误。如果需要,我可以给你更多信息。请帮忙。 谢谢。
【问题讨论】:
-
cm_loc是一个 vector,因此它确实没有任何名为depth或width的成员。相反,cm_loc[j]确实... -
请编辑您的问题以删除 MPI(并且,我希望将其替换为 OpenMP),除非您确实指的是 MPI(您对“跨多个进程”的评论可能暗示了这一点。如果这只是OpenMP 代码,那么您的意思是“跨多个线程”。另外,由于您显示编译器错误,因此“当我运行此代码时”显然不会发生。
-
@Gilles 是的,你是对的,我试图通过明确提及 cm_loc[0] 来运行代码,当时这个错误不会出现。我想在本地创建跨所有进程的结构 cm_loc 并执行 MPIAllreduce。您能否帮助我了解如何在所有进程中创建 CM_type 的本地结构?
-
@JimCownie 是的,我的意思是跨多个进程,而不仅仅是多线程,我的目标是跨多个进程构建 CM_type 结构实例 (cm_loc),其中进程可以独立初始化它们的 cm_loc,然后做一些工作(这是另一个函数),然后执行 MPI_Allreduce()。
-
对于 MPI 方面的事情,你可能想看看这个:stackoverflow.com/questions/33618937/…
标签: c++ multithreading struct parallel-processing openmp