
Следующая функция дает правильный результат, используя 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