在MPI中没有强制转换的情况下传递参数

时间:2011-05-01 20:19:32

标签: mpi

对于我的作业,我必须使用MPI的共轭梯度程序测试几个大型矩阵(参见下面的代码)。我从我的书中复制了程序,它应该编译,但我得到了错误:

  

在功能'main'中:

     

37:警告:传递read_replicated_vector的参数1使得指针来自整数而没有强制转换

     

37:警告:传递read_replicated_vector的参数2使得整数指针没有强制转换

     

37:警告:传递read_replicated_vector的参数3使得没有强制转换的指针产生整数

     

37:警告:从不兼容的指针类型

传递read_replicated_vector的参数4      

37:错误:无法忽略空值,因为它应该是

     

44:警告:传递print_replicated_vector的参数1使得整数指针没有强制转换

     

44:警告:传递print_replicated_vector的参数3使得没有强制转换的指针产生整数

     

44:错误:函数print_replicated_vector

的参数太多
#include <stdlib.h>
#include <stdio.h>
#include "mpi.h"
#include "MyMPI.h"

main (int argc, char *argv[])
{
  double **a;                /* Solving Ax = b for x */
  double *astorage;          /* Holds elements of A */
  double *b;                 /* Constant vector */
  double *x;                 /* Solution vector */
  int     p;                 /* MPI Processes */
  int     id;                /* Process rank */
  int     m;                 /* Rows in A */
  int     n;                 /* Columns in A */
  int     n1;                /* Elements in b */

  /* Initialize a and b so that solution is x[i] = i */

  MPI_Init (&argc, &argv);
  MPI_Comm_size (MPI_COMM_WORLD, &p);
  MPI_Comm_rank (MPI_COMM_WORLD, &id);

  read_block_row_matrix (id, p, argv[1], (void *) &a,
  (void *) &astorage, MPI_DOUBLE, &m, &n);
  n1 = read_replicated_vector (id, p, argv[2], (void **) &b, MPI_DOUBLE);
  if ((m != n) || (n != n1)) 
  {
      if (!id)
          printf ("Incompatible dimensions (%d x %d) x (%d)\n", m, n, n1);
  } 
  else {
      x = (double *) malloc (n * sizeof(double));
      cg (p, id, a, b, x, n);
      print_replicated_vector (id, p, x, MPI_DOUBLE, n); // here
  }
  MPI_Finalize();
}

idp不是指针,所以我认为我需要在调用MPI_Comm_sizeMPI_Comm_rank时通过引用传递它们,尽管我尝试过这样做。

修改

//输入函数

void read_replicated_vector (
char        *s,      /* IN - File name */
void       **v,      /* OUT - Vector */
MPI_Datatype dtype,  /* IN - Vector type */
int         *n,      /* OUT - Vector length */
MPI_Comm     comm)   /* IN - Communicator */
{
  int        datum_size; /* Bytes per vector element */
  int        i;
  int        id;         /* Process rank */
  FILE      *infileptr;  /* Input file pointer */
  int        p;          /* Number of processes */

  MPI_Comm_rank (comm, &id);
  MPI_Comm_size (comm, &p);
  datum_size = get_size (dtype);
  if (id == (p-1)) 
  {
    infileptr = fopen (s, "r");
    if (infileptr == NULL) *n = 0;
    else fread (n, sizeof(int), 1, infileptr);
  }
  MPI_Bcast (n, 1, MPI_INT, p-1, MPI_COMM_WORLD);
  if (! *n) terminate (id, "Cannot open vector file");

  *v = my_malloc (id, *n * datum_size);

  if (id == (p-1)) 
  {
    fread (*v, datum_size, *n, infileptr);
    fclose (infileptr);
  }

  MPI_Bcast (*v, *n, dtype, p-1, MPI_COMM_WORLD);
}

//输出函数

void print_replicated_vector (
void        *v,      /* IN - Address of vector */
MPI_Datatype dtype,  /* IN - Vector element type */
int          n,      /* IN - Elements in vector */
MPI_Comm     comm)   /* IN - Communicator */
{
   int id;              /* Process rank */

   MPI_Comm_rank (comm, &id);

   if (!id)
   {
     print_subvector (v, dtype, n);
     printf ("\n\n");
   }
}

1 个答案:

答案 0 :(得分:1)

您的警告是因为您正在调用该功能

void print_replicated_vector (void *, MPI_Datatype, int, MPI_Comm);

第一个参数类型为int

print_replicated_vector (id, p, x, MPI_DOUBLE, n); // here

C代码有时会在int中存储一个指针,这就是编译器假设你要做的事情,它正在进行适当的类型转换(但警告你)。但为了使代码更正,你必须使类型匹配。即使用&id传递指向id的指针或任何适当的参数(我不知道print_replicated_vector做了什么或者你想要它做什么)。