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

在没有强制转换的MPI中传递参数,mpi,Mpi,在我的家庭作业中,我必须使用这个带有MPI的共轭梯度程序测试几个大矩阵(见下面的代码)。我从我的书中复制了这个程序,它应该可以编译,但我得到了错误: 在函数“main”中: 37:警告:传递read_replicated_向量的参数1会使指针从整数变为不带强制转换的整数 37:警告:传递read_replicated_向量的参数2会使指针从整数变为不带强制转换的整数 37:警告:传递read_replicated_向量的参数3会从指针生成一个不带强制转换的整数 37:警告:传递来自不兼容指针类型

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

在函数“main”中:

37:警告:传递read_replicated_向量的参数1会使指针从整数变为不带强制转换的整数

37:警告:传递read_replicated_向量的参数2会使指针从整数变为不带强制转换的整数

37:警告:传递read_replicated_向量的参数3会从指针生成一个不带强制转换的整数

37:警告:传递来自不兼容指针类型的read_replicated_向量的参数4

37:错误:未按应忽略的方式忽略void值

44:警告:传递print_replicated_vector的参数1会使指针从整数变为不带强制转换的整数

44:警告:传递print_replicated_向量的参数3会从指针生成整数,而不进行强制转换

44:错误:函数print\u replicated\u vector的参数太多

//输出函数

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");
   }
}

您的警告是因为您正在调用函数

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\u replicated\u vector
做什么或您希望它做什么)。

错误在
read\u replicated\u vector
print\u replicated\u vector
的参数中;我们需要查看这两个函数的原型,才能了解问题所在。@Jonathan Dursi这些函数直接来自MPI标准库。不,它们不是。MPI函数以
MPI\uu
开头。我在谷歌上搜索了你的东西,看起来你的作业包含了一个声明这些内容的MyMPI.h文件。这是你的助手吗<代码>无效打印向量(无效*,MPI数据类型,整数,MPI通信)@Adam我也有MPI.h文件。我不知道我是否应该在编译时包含它。现在当我编译时,我使用mpicc MyMPI.c-o cgradent cgradent.c。你是说我也应该包括头文件吗。这种联系类似于我们在书中的附录。当然,它们都是由作者Micheal J.Quinn编写的。你需要MPI.h。这是一个系统标题
mpicc
的工作是确保MPI的include/library路径是正确的(事实上,
mpicc
只是一个非常薄的包装器,它调用实际的编译器,比如
gcc
,并添加了include/library开关)。我想说的是,就问题而言,MyMPI.c/h是用户代码。它们不是来自系统,只有你有代码。@Adam哦,我明白了。我将做出改变,看看是否仍然有错误。感谢我再次查看它,您将5个参数传递给一个只需要4个参数的函数。。。你点的菜好像错了。MPI_DOUBLE是一个MPI_数据类型,因此它应该是第2个参数,而不是第4个参数。最后一个是通信器,很可能是MPI\u COMM\u WORLD,除非你创建其他的(我看不到你这么做)。@Adam我也意识到print\u replicated\u verctor只需要4个参数。再说一次,这是直接从书中得到的,所以我不想改变任何假设它应该运行的东西,但我想不会。@Adam有什么建议吗??哪个论点是多余的?抱歉,这是一个奇怪的问题,但一条线索会很有帮助。@Adam顺便说一句,这里是完整在线程序的类似代码。唯一的区别是我没有包括的OpenMP pragmas。另外,read_replicated_向量和print_replicated_向量丢失,但我在问题中添加了这两个向量。
print_replicated_vector (id, p, x, MPI_DOUBLE, n); // here