首页 > 解决方案 > 在 C 中使用 MPI 从文件中读取数据块

问题描述

我有一大块数据存储在一个文件(v_1 到 v_5)中。使用这些数据,我必须计算(v_6 到 v_9)和协方差矩阵。现在我必须将我的通用代码转换为 MPI,用于负责读取数据并检查数据读取正确性的部分。我无法理解如何在我的代码中使用 MPI!任何人都可以帮助我,因为我是初学者。在这里,我提供了我的通用代码。

先感谢您。

#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <math.h>

#include "need.h"

#define NELEMENTS 1342177

int main(int argc, char **argv)
{
    int i,k,j;
    // allocate memory
    double *var[10];
    for (i = 0; i < 10; i++)
        cppmallocl(var[i], NELEMENTS, double); // call cppmallocl from need.h

    // Read binary data
    
    FILE *fp;
    char file_name[128];
    for (i = 0; i < 5; i++)
    {
        sprintf(file_name, "/home/data/var%d.dat", i + 1);
        printf("#  DATA: `%s`...\n", file_name);

        fp = fopen(file_name, "rb");
        if (fp == NULL)
        {
            printf("# ERROR: Cannot open `%s`!\n", file_name);
            return EXIT_FAILURE;
        }

        size_t ftest = fread(var[i], sizeof(double), NELEMENTS, fp);
        if (ftest != NELEMENTS)
         {
            printf("# ERROR: Cannot read `%s`!\n", file_name);
            return EXIT_FAILURE;
         }

        fclose(fp);
    }
    

    // v_6, ..., v_10 
   
    for(i=0;i<NELEMENTS;i++)
     {
         var[5][i] = cos(var[0][i]);
         var[6][i] = (-1 * (exp(var[4][i])));
         var[7][i] = cos(var[0][i])) + sin(var[2][i]));
         var[8][i] = hypot(var[3][1], var[1][i]);
         var[9][i] = cbrt(var[3][i]);
       

     }

    // covariance matrix

    double cov[10][10];
          
    double average[10];

   //  average 

    for( i = 0; i < 10; i++)
    { 
      double sum= 0.0;   
      for (j=0;j< NELEMENTS;j++)
        {
          sum = sum + var[i][j];
       }
        average[i] = sum /NELEMENTS;
    }
  //  covariance

    for (i = 0; i < 10; i++)
    {
        for (j=0; j<10;j++)
         
        { if (i>=j) 
           {
             double covsum = 0.0;

            for(k=0;k<NELEMENTS;k++)
             {
                covsum = covsum + (var[i][k] - average[i]) * (var[j][k] - average[j]);
            
             }
           cov[i][j] = covsum /(NELEMENTS-1);

           }
          
       
        }
    }

    

    // print

    for (i = 0; i < 10; i++)
        for (j = 0; j <= i; j++)
            printf("cov(%2d,%2d)=%16.8g\n", i + 1, j + 1, cov[i][j]);

    return (EXIT_SUCCESS);
}

标签: cmpi

解决方案


推荐阅读