2014-05-06 4 views
-5

Мне нужно написать функцию C, которая вычисляет минимальное значение из n входов и вставляет их в порядке возрастания в массиве. Ничего особенного в отношении входных данных. Все положительные и < 100. Сложная часть состоит в том, что результаты исходят от блокирующего MPI_Recv(), и выход не только должен вычислять текущий минимум с n входов, но также должен отслеживать, какие значения уже были вставлены в массив результатов, чтобы они могли быть соображениями для будущих групп из n входов.вычислить минимальное значение из n целых чисел

Короче говоря, мастер MPI разбивает masterArray (заполненный случайными целыми числами) на subArrays. Рабы сортируют субархивы и возвращают их мастеру. Затем мастер должен сшить обратно отсортированные подархивы в один отсортированный finalArray (если только я не могу повторно использовать masterArray). Мастер получает n subArrays, в зависимости от количества ведомых, нужно выбрать, сказать в первый раз, наименьшее из n значений из n массивов, а затем необходимо продвинуть указатель на массив, который был выбран, поэтому это значение больше не рассматривается. Это нужно делать, пока все значения не будут перенесены в порядке возрастания в finalArray.

То, как я хранил отсортированные подархивы, когда они вошли из реквизитора мастера, был в memcpy() массиве temp каждый элемент chunkSize, где chunkSize = ARRAY_SIZE/(nprocs-1) в 1D массив, который я назвал, semiSortedArrays ,

Во-первых, я не совсем уверен, как вы определяете функцию, которая принимает n значений. У меня возникают проблемы с отслеживанием всех указателей и как передать n параметров вызову функции. Я бы очень признателен за помощь, поскольку я смущен.

Большое спасибо, Скотт

+3

TL; DR, но где ваш код, на который нужно смотреть? – xxbbcc

+0

Errr Почему это связано с сортировкой? MPI имеет метод уменьшения, который может сделать это за один вызов. http://mpitutorial.com/mpi-reduce-and-allreduce/: "* MPI_MIN - возвращает минимальный элемент. *" – luk32

+0

_A функция, которая принимает n values_ int * array; array = malloc (7); void func1 (int * a); и так далее. У вас есть код, который вы пробовали? – ryyker

ответ

5

Первая вещь, я не совсем уверен, как вы определяете функцию, которая принимает значения п.

Не пытайтесь. Сделайте метод, который принимает указатель на первый элемент массива значений, а целочисленное число - для определения того, что такое n.

У меня возникли проблемы отслеживания всех указателей

Я не сомневаюсь в этом. C это сложно.

Я очень благодарен за помощь, поскольку я смущен.

Мой первый совет: удалить этот вопрос, а затем задать более конкретный технический вопрос о фактическом коде.

Хитрость в том, что результаты поступают из блокирующего MPI_Recv(), а выход не только для вычисления тока минимум из п входов, но также необходимо отслеживать, какие значения уже были вставлены в массив результатов, чтобы они могли быть соображениями для будущих групп из n входов.

Мой второй бит совет: прежде чем написать еще одну строку кода, написать спецификацию.Попробуйте написать спецификацию в терминах одного или нескольких функций, каждый из которых принимает значения , не мутируют эти значения, и выдает результат в зависимости исключительно от значений, которые были ввода. Постарайтесь сделать функции достаточно маленькими и достаточно ясными, чтобы их можно было понять и проверить самостоятельно.

Такая функция называется чистой функцией, и это далеко легче рассуждать о чистых функциях, чем рассуждать о функциях, которые изменяют свои аргументы.

После того, как у вас есть эта спецификация, вы можете тщательно написать код, соответствующий спецификации. Возможно, вы получите много копий состояния. Хорошо. Как только код исправьте и передав обширный набор тестов, вы можете попытаться выяснить, как сделать это быстрее или сделать мутации или что-то еще.

Короче:

  • Design
  • Реализовать
  • Test
  • Оптимизировать

в таком порядке.

+0

Так, чтобы дать некоторые из моего кода, я борюсь с, вот функция четкости, которая пытается найти минимум, но глючит: INT минимум (интермедиат * массив, Int размер) { \t ИНТ минимум, i, location = 1; \t minimum = array [0]; для (i = 0; i <размер; i ++) { if (array [i] user3583629

+0

для (к = 0; к user3583629

+0

Начните новый вопрос и удалить этот. Убедитесь, что новый вопрос определен. Я не могу найти, что мои ошибки не являются конкретным вопросом. –

Смежные вопросы