Как мне реализовать функцию масштабирования в моем коде для генерации Мандельброта с помощью mpi? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как мне реализовать функцию масштабирования в моем коде для генерации Мандельброта с помощью mpi? [закрыто]

Сообщение Anonymous »

Мне удалось реализовать одношаговую генерацию с использованием Open MPI, распределив вычисления Мандельброта по 4 процессорам. Теперь я хочу добавить функцию масштабирования, но не знаю, с чего начать.

Код: Выделить всё

void scatter_gather_mandelbrot(int size_of_cluster, double scale, double cx, double cy){
// Determine root's rank
int root_rank = 0;

// Get my rank
int my_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

int max_iter = 512;

double recvbuf_r1[SIZE/2]={0};
double recvbuf_r2[SIZE/2]={0};

//Scattering
if (my_rank == root_rank) {
double r1[SIZE]; // ilk yarısını 0 ve 1'ye, ikinci yarısını 2 ve 3'e
double r2[SIZE]; // ilk yarısını 0 ve 2'e, ikinci yarısını 1 ve 3'e
// Define the range and resolution of the fractal
double xmin = -scale, xmax = scale, ymin = -scale, ymax = scale;

for (int i = 0; i < SIZE; ++i) {
r1[i] = xmin + (i * (xmax - xmin) / (SIZE - 1));
r2[i] = ymin + (i * (ymax - ymin) / (SIZE - 1));
}

printf("\n");
int counts[4];
int displacements_r1[4] = {0, 0, SIZE/2, SIZE/2};
int displacements_r2[4] = {0, SIZE/2, 0, SIZE/2};
for (int i = 0; i < size_of_cluster; i++)
{
counts[i] = SIZE/2;
}
MPI_Scatterv(r1, counts, displacements_r1, MPI_DOUBLE, recvbuf_r1, SIZE/2, MPI_DOUBLE, root_rank, MPI_COMM_WORLD);
MPI_Scatterv(r1, counts, displacements_r2, MPI_DOUBLE, recvbuf_r2, SIZE/2, MPI_DOUBLE, root_rank, MPI_COMM_WORLD);
}
else {
MPI_Scatterv(NULL, NULL, NULL, MPI_DOUBLE, recvbuf_r1, SIZE/2, MPI_DOUBLE, root_rank, MPI_COMM_WORLD);
MPI_Scatterv(NULL, NULL, NULL, MPI_DOUBLE, recvbuf_r2, SIZE/2, MPI_DOUBLE, root_rank, MPI_COMM_WORLD);
}

MPI_Barrier(MPI_COMM_WORLD);

int local_result[SIZE/2][SIZE/2];

for (int i = 0; i < SIZE/2; ++i) {
for (int j = 0; j < SIZE/2; ++j) {
complex c(cx+recvbuf_r1[j], cy+recvbuf_r2[i]);
local_result[i][j] = mandelbrot(c, max_iter);
}
}

MPI_Barrier(MPI_COMM_WORLD);

// NxN matrix 4 equal blocks
const int NPROWS=2;  // block row width
const int NPCOLS=2;  // block column length
const int CELLS_PER_ROW = SIZE/NPROWS;  // number of rows in block
const int CELLS_PER_COLUMN = SIZE/NPCOLS; // number of cols in block
const int BLOCK_SIZE = CELLS_PER_ROW * CELLS_PER_COLUMN;

// Create the vector datatype
MPI_Datatype column_not_resized;
MPI_Type_vector(CELLS_PER_COLUMN, CELLS_PER_ROW, SIZE, MPI_INT, &column_not_resized);

// Resize it to make sure it is interleaved when repeated
MPI_Datatype column_resized;
MPI_Type_create_resized(column_not_resized, 0, sizeof(int), &column_resized);
MPI_Type_commit(&column_resized);

// Gathering
if (my_rank == root_rank) {
int mandelbrotdata[SIZE][SIZE];
int counts[4];
int displacements[4] = {0, SIZE*(SIZE/2), (SIZE/2), SIZE*(SIZE/2)+(SIZE/2)};
for (int i = 0; i < 4; i++) counts[i] = BLOCK_SIZE;

printf("\n");
MPI_Gatherv(local_result, BLOCK_SIZE, MPI_INT, mandelbrotdata, counts, displacements, column_resized, root_rank, MPI_COMM_WORLD);
draw(mandelbrotdata, max_iter);
}
else {
MPI_Gatherv(local_result, BLOCK_SIZE, MPI_INT, NULL, NULL, NULL, column_resized, root_rank, MPI_COMM_WORLD);
}
}

int main(int argc, char* argv[])
{
MPI_Init(&argc, &argv);

// Get number of processes and check that 4 processes are used
int size_of_cluster;
MPI_Comm_size(MPI_COMM_WORLD, &size_of_cluster);
if(size_of_cluster != 4)
{
printf("This application is meant to be run with 4 processes.\n");
MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
}
double scale = 0.3;
double cx = -1.0;
double cy = 0.0;
scatter_gather_mandelbrot(size_of_cluster, scale, cx, cy);

MPI_Finalize();

return EXIT_SUCCESS;
}
Я подумал об изменении двойного масштаба cx, cy с помощью пользовательского ввода. Но не знаю, как это реализовать. Я использую графику SFML для отображения в виде окна.


Подробнее здесь: https://stackoverflow.com/questions/785 ... ot-with-mp
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Проблема со связью MPI в Python (с использованием MPI.COMM_WORLD.isend и MPI.COMM_WORLD.irecv) — нет получения
    Anonymous » » в форуме Python
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Оптимизация расчета множества Мандельброта на C++ на высокопроизводительном процессоре
    Гость » » в форуме C++
    0 Ответы
    15 Просмотры
    Последнее сообщение Гость
  • Поточная программа Мандельброта C++
    Anonymous » » в форуме C++
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Генерация изображений Мандельброта в C++ с использованием многопоточности. Нет ускорения?
    Anonymous » » в форуме C++
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Как ускорить сюжет множества Мандельброта
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»