Есть ли проблема в C с malloc и MPI?

Извините, я не могу опубликовать исходный код...

У меня есть код, выполняющий красно-черный алгоритм ведущий/ведомый для решателя GS. В простом случае матрица разбивается на 4 вычислительные части одинакового размера. Изображения 1-3 выполняют свою часть вычислений и отправляют обратно буферы с результатами на изображение 0. Проблема заключается в следующем:

Я создал malloc массив, достаточно большой, чтобы вместить все части, чтобы я мог отобразить отдельные результаты обратно в единую сетку. Проблема, по-видимому, заключается в том, что на изображении 0 после вызова MPI_Recv этот процесс больше не знает, что сетка была выделена для хранения всего этого. Я получаю сообщение об ошибке каждый раз, когда пытаюсь что-то поместить в эту сетку. Единственный обходной путь, который я нашел, это выполнить malloc для всех процессов и снова malloc для нулевого процесса прямо перед MPI_Recv.

Любые идеи, почему он, по-видимому, теряет ссылку на эту ранее выделенную память?

В псевдокоде:

Malloc whole[][] Have to have this allocated
Malloc partial[]
Perform compute on whole[]

If(image!= 0) MPI_Send(whole[])
Else (if image==0) 
  Malloc whole[][] again!  and this allocated otherwise the problem happens
  Loop over other images
  MPI_Recv(partial)
  Put partial[] into whole[][] Here is where the problem occurs
Endif

Спасибо за помощь в продвижении


person Derek    schedule 04.03.2010    source источник
comment
Вы уверены, что это проблема MPI? Вы пытались просто закомментировать биты MPI и просто попытаться скопировать что-то из частичного (заполнить фиктивными данными) в целое?   -  person Il-Bhima    schedule 04.03.2010
comment
Да, я пробовал то, что вы сказали. При серийной работе работает нормально. Что-то в MPI_Send/recv вызывает сдувание указателя. Я не уверен, что. Я прокомментировал ниже, что, возможно, это как-то связано с использованием MPI_Datatype, который я определил вместо буфера MPI_DOUBLE. есть идеи?   -  person Derek    schedule 05.03.2010


Ответы (1)


очень-очень маловероятно, что это ошибка библиотеки. Без увиденного исходного кода практически невозможно найти проблему. Я предполагаю, что вы неправильно выделяете или перезаписываете выделенные указатели каким-то мусором. Чтобы проверить это, напечатайте значения указателя сразу после выделения и прямо перед/после получения mpi.

person Anycorn    schedule 04.03.2010
comment
Я попробовал то, что вы сказали, распечатав значения указателя после malloc, прямо перед MPI_Recv и сразу после MPI_Recv. Как вы и подозревали, указатель сдувается сразу после команды Recv. Этот конкретный Recv находится только на изображении 0 и получает тип, который я определил, называемый матрицей, который я определил для хранения 2D-массива. Как вы думаете, это может иметь какое-то отношение к этому? Есть ли разница между отправкой буфера MPI_DOUBLE и MPI_Datatype? - person Derek; 05.03.2010