Nano Hash - криптовалюты, майнинг, программирование

Заставьте ведомые устройства ждать MPI_Bcast от ведущего.

Я пытаюсь написать параллельную программу, которая реализует конвейерную версию исключения Гаусса, используя язык MPI и C...

Однако я сталкиваюсь с некоторыми трудностями в начале реализации кода....

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

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <mpi.h>

int CalcInd(int i, int j, int dimL)
{
  return i*dimL +j;
}

int main (int argc, char **argv)
{
  FILE *fin, *fout;
  char fA[] = "Matrix.txt";

  int rank, size, i, ii, j, k, m, n, picked, tmp, total;
  int  counter=0, elements=0;
  int * RightNeigbhor, * LeftNeigbhor, * loc;

  float f, magnitude, t;
  float * A, * x;

  MPI_Status status;
  MPI_Request request;

  // MPI initialization
  MPI_Init(&argc, &argv);  
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  MPI_Barrier(MPI_COMM_WORLD);

  if(rank == 0)
  {
    // Defenição dos processos vizinhos pelo master
    RightNeigbhor = (int *)calloc(size,sizeof(int));
    if(RightNeigbhor==NULL)
      {printf("!!! Could not allocate memory !!!\n"); exit(-1);}
    LeftNeigbhor = (int *)calloc(size,sizeof(int));
    if(RightNeigbhor==NULL)
      {printf("!!! Could not allocate memory !!!\n"); exit(-1);}

    for(i = 0; i < size; i++ )
    {
      RightNeigbhor[i] = (rank + 1) % size;
      LeftNeigbhor[i] = (rank - 1) % size;
    }
    // Broadcast os processos vizinhos para todos os processos
    MPI_Bcast ( RightNeigbhor, size, MPI_INTEGER, rank, MPI_COMM_WORLD );
    MPI_Bcast ( LeftNeigbhor, size, MPI_INTEGER, rank, MPI_COMM_WORLD );

    // Leitura da matriz A pelo master
    fin = fopen ( fA, "r" ); 
    if (fin == NULL){ printf("!!! FILE NOT FOUND !!!"); exit(-1); }
    while( !feof(fin))
    {
      fscanf (fin, "%f", &f);
      elements++;
    }
    rewind(fin);
    f = 0;

    while( !feof(fin))
    {
      if(fgetc(fin) == '\n')
      {
    counter++;
      }
    }
    rewind(fin);

    n = counter;
    m = (elements-1) / counter;

   total = n*m;   

   MPI_Bcast ( &total, 1, MPI_INT, rank, MPI_COMM_WORLD );
   MPI_Bcast ( &n, 1, MPI_INT, rank, MPI_COMM_WORLD );

  }

  // Alocação de variaveis
  A = (float *)calloc(total,sizeof(float));
  if(A==NULL){printf("!!! Could not allocate memory !!!\n"); exit(-1);}
  loc = (int *)calloc(n,sizeof(int*));
  if(loc==NULL){printf("!!! Could not allocate memory !!!\n"); exit(-1);}

// AND IT GOES ON AND ON

  • MPI_Bcast — коллективная операция. Каждый ранг должен опубликовать MPI_Bcast для завершения операции. Следуйте совету Борта. 22.01.2013

Ответы:


1

Все в вашем блоке rank == 0 выполняется только в процессе 0. В то время как процесс rank == 1 ... n просто пропустите этот блок. Поэтому вы должны поместить свои MPI_Bcast вызовы в среду, которая видна для всех процессов в MPI_Comm comm здесь MPI_COMM_WORLD. Когда процесс 1...n пропустит всю инициализацию и перейдет к широковещанию до того, как процесс 0 достигнет его, они будут ждать, пока не произойдет широковещательная рассылка.

22.01.2013
  • Итак, куда именно пойдет MPI_Bcast? Кажется, если вы поместите его перед if(rank==...), тогда все процессы будут выполнять эту задачу, поэтому можете ли вы указать, где именно в этом сценарии она будет выполняться? 04.04.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..