#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 /…