Передача аргумента без приведения в MPI

#mpi

#mpi

Вопрос:

Для моей домашней работы я должен протестировать несколько больших матриц, используя эту программу сопряженного градиента с MPI (см. Код ниже). Я скопировал программу из своей книги, и она должна быть скомпилирована, но я получаю ошибки:

В функции ‘main’:

37: предупреждение: передача аргумента 1 из read_replicated_vector создает указатель из целого числа без приведения

37: предупреждение: передача аргумента 2 из read_replicated_vector создает указатель из целого числа без приведения

37: предупреждение: передача аргумента 3 из read_replicated_vector преобразует целое число из указателя без приведения

37: предупреждение: передача аргумента 4 read_replicated_vector из несовместимого типа указателя

37: ошибка: пустое значение не игнорируется, как должно быть

44: предупреждение: передача аргумента 1 из print_replicated_vector создает указатель из целого числа без приведения

44: предупреждение: передача аргумента 3 из print_replicated_vector преобразует целое число из указателя без приведения

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 (amp;argc, amp;argv);
  MPI_Comm_size (MPI_COMM_WORLD, amp;p);
  MPI_Comm_rank (MPI_COMM_WORLD, amp;id);

  read_block_row_matrix (id, p, argv[1], (void *) amp;a,
  (void *) amp;astorage, MPI_DOUBLE, amp;m, amp;n);
  n1 = read_replicated_vector (id, p, argv[2], (void **) amp;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();
}
  

id и p не являются указателями, поэтому я думаю, что мне нужно передавать их по ссылке в вызовах на MPI_Comm_size и MPI_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, amp;id);
  MPI_Comm_size (comm, amp;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, amp;id);

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

Комментарии:

1. Ошибки заключаются в аргументах read_replicated_vector и print_replicated_vector ; нам нужно посмотреть прототипы для этих двух функций, чтобы понять, в чем проблема.

2. @Jonathan Dursi эти функции поступают прямо из стандартной библиотеки MPI.

3. нет, это не так. Функции MPI начинаются с MPI_ . Я погуглил вашу вещь, и похоже, что ваше назначение включает файл MyMPI.h, который объявляет их. Это ваше назначение fac-staff.seattleu.edu/quinnm/web/education/ParallelProgramming /… ? void print_replicated_vector (void *, MPI_Datatype, int, MPI_Comm);

4. @Adam У меня также есть файл MPI.h. Я не знаю, следует ли мне включать это при компиляции. Прямо сейчас, когда я компилирую, я использую mpicc MyMPI.c -o cgradient cgradient.c. Вы хотите сказать, что я также должен включить файл заголовка. Эта ссылка похожа на ту, что мы имеем в приложении к нашей книге. Конечно, все они запрограммированы автором «Майклом Дж. Куинном».

5. Вам нужен MPI.h. Это системный заголовок. mpicc задача состоит в том, чтобы убедиться, что пути включения / библиотеки для MPI такие, какими они должны быть (фактически, mpicc это просто очень тонкая оболочка, которая вызывает ваш реальный компилятор, например gcc , с добавленными переключателями включения / библиотеки). Я пытаюсь сказать, что MyMPI.c / h — это пользовательский код, насколько это касается вопроса. Они не поступают из системы, и только у вас есть этот код.

Ответ №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 с amp;id или любым другим подходящим аргументом (я не знаю, что print_replicated_vector делает или что вы хотите, чтобы это делало).

Комментарии:

1. @Adam о, я понимаю. Я собираюсь внести это изменение и посмотреть, по-прежнему ли я получаю ошибки. Спасибо

2. Теперь, когда я смотрю на это снова, вы передаете 5 аргументов функции, которая принимает только 4… И ваш порядок кажется неправильным. MPI_DOUBLE — это MPI_Datatype, так что это должен быть 2-й аргумент, а не 4-й. Последний — это коммуникатор, вероятно, MPI_COMM_WORLD, если вы не создадите другие (я не вижу, чтобы вы это делали).

3. @Adam Я также понял, что print_replicated_verctor принимает только 4 аргумента. Опять же, это взято прямо из книги, поэтому я не хотел ничего менять, предполагая, что это должно выполняться, но я думаю, что нет.

4. @Adam Есть какие-нибудь рекомендации?? Какой аргумент является дополнительным? Извините, это странный вопрос, но подсказка была бы полезна..

5. @Adam кстати, вот аналогичный код для полной программы онлайн. Единственное отличие — это программы OpenMP, которые я не включаю. Также отсутствуют read_replicated_vector и print_replicated_vector, но я добавил их сюда в своем вопросе. fac-staff.seattleu.edu/quinnm/web/education/ParallelProgramming /…