Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在MPI中为多个进程创建结构_C++_Multithreading_Struct_Parallel Processing_Openmp - Fatal编程技术网

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

C++ 如何在MPI中为多个进程创建结构,c++,multithreading,struct,parallel-processing,openmp,C++,Multithreading,Struct,Parallel Processing,Openmp,我是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(

我是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];
          
      }  
}   
std::vector CM_Init(int-width、int-depth、int-seed)
{
int j;
prng_类型*prng;
prng=prng_Init(-abs(seed),2);
#pragma omp并行共享(宽度、深度、prng)专用(j)
{
//CM_型CM_loc;
std::向量cm_loc;
//std::向量cm_loc;
cm_loc.depth=深度;
cm_loc.width=宽度;
cm_loc.count=0;
cm_loc.counts=(int**)calloc(sizeof(int*),cm_loc.width);
厘米定位计数=(整数*)calloc(尺寸(整数),厘米定位深度*厘米定位宽度);
//cm->total=0;
cm_loc.hasha=(无符号整数*)calloc(sizeof(无符号整数),cm_loc.depth);
cm_loc.hashb=(无符号整数*)calloc(sizeof(无符号整数),cm_loc.depth);
if(cm_loc.counts&&cm_loc.hasha&&cm_loc.hashb&&cm_loc.counts[0])
{

对于(j=0;j请阅读有关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或其他任何东西中排除了!

<代码> CMY-LoC 是一个向量,所以它确实没有任何成员名为“代码>深度< /COD>”或“代码>宽度< /代码>。相反,代码> CMYLoC [j] < /代码>…请编辑你的问题以移除MPI。(我希望用OpenMP替换它),除非你的意思是MPI(你关于“跨多个进程”的评论可能暗示了这一点。如果这都是OpenMP代码,那么你的意思是“跨多个线程”。此外,由于你显示了编译器错误,“当我运行此代码时”显然不会发生这种情况@Gilles是的,你是对的,我试图通过明确提到cm_loc[0]来运行代码在那个时候,这个eror不会出现。我想在所有本地进程中创建结构cm_loc,并进行MPialReduce。您能帮助我如何在所有进程中创建cm_类型的本地结构吗?@JimCownie是的,我的意思是跨多个进程,而不仅仅是多线程,我的目标是构建cm_类型跨多个进程的truct Instant(cm_loc),其中进程可以独立初始化其cm_loc,然后执行一些工作(这是另一个函数),然后执行MPI_Allreduce()。对于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);
}