MPI вычисляет тензор * матрицу с тензором, определенным в глобальном масштабе с использованием библиотеки Global ArraysC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 MPI вычисляет тензор * матрицу с тензором, определенным в глобальном масштабе с использованием библиотеки Global Arrays

Сообщение Anonymous »

Я пытаюсь использовать библиотеку Global Arrays с MPI на C++, поскольку она позволяет определять переменные большого размера только один раз публично и в то же время доступны для доступа всем процессам MPI. Поэтому я создал небольшую программу, которая выполняет следующие математические операции:
Изображение

Следующая функция дает правильный результат, используя 1 процесс:
Tensor tensorxmatrix(const Tensor &tensor, const MatrixXd &matrix)
{
int pid;
MPI_Comm_rank(MPI_COMM_WORLD, &pid);
Tensor result(tensor.dimension(0), tensor.dimension(1), tensor.dimension(2));
result.setZero();
for (int i = 0; i < tensor.dimension(0); i++)
{
for (int j = 0; j < tensor.dimension(1); j++)
{
for (int k = 0; k < tensor.dimension(2); k++)
{
for (int l = 0; l < matrix.rows(); l++)
{
result(i, j, k) += tensor(i, j, l) * matrix(l, k);
}
}
}
}
return result;
}

Вот код GA-MPI, который я написал, который должен давать тот же результат, что и выше:
Tensor vectorisedtensorxmatrix_gampi(const Tensor &tensor, const MatrixXd &matrix)
{
const auto &dim0 = tensor.dimension(0);
const auto &dim1 = tensor.dimension(1);
const auto &dim2 = tensor.dimension(2);

int me = GA_Nodeid();
int nproc = GA_Nnodes();

vector vec_tensor = ConvertTensorToVector(tensor);

const int num_total_tasks = dim0 * dim1;
const int num_tasks_per_proc = num_total_tasks / nproc;
const int remainder = num_total_tasks % nproc;

int tensor_size = dim0 * dim1 * dim2;
int g_vector = NGA_Create(C_DBL, 1, &tensor_size, "g_vector", NULL);
int g_vec_result_tensor = NGA_Create(C_DBL, 1, &tensor_size, "g_vec_result_tensor", NULL);

if (me == 0)
{
int lo = 0;
int hi = dim0 * dim1 * dim2 - 1;
NGA_Put(g_vector, &lo, &hi, vec_tensor.data(), NULL);
}
GA_Zero(g_vec_result_tensor);
GA_Sync();

const int start_task = me * num_tasks_per_proc;
const int end_task = (me == nproc - 1) ? (start_task + num_tasks_per_proc + remainder - 1) : (start_task + num_tasks_per_proc - 1);

for (int taskID = start_task; taskID

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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