【问题标题】:How to create structs for multiple processes in MPI如何在 MPI 中为多个进程创建结构
【发布时间】: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,因此它确实没有任何名为 depthwidth 的成员。相反,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


【解决方案1】:

请去阅读几乎所有关于 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 或其他任何东西无关!

【讨论】:

    猜你喜欢
    • 2015-01-09
    • 2013-11-07
    • 2013-04-27
    • 2014-11-24
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多