/*
* Copyright (C) 2011-2013 Karlsruhe Institute of Technology
*
* This file is part of Ufo.
*
* This library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*/
#include
#include
#include "test-suite.h"
#include
#include
typedef struct {
UfoDaemon *daemon;
UfoConfig *config;
UfoRemoteNode **remote_nodes;
gint global_size;
gint rank;
} Fixture;
static void
setup (Fixture *fixture, gconstpointer data)
{
fixture->config = ufo_config_new ();
int size, rank;
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
MPI_Comm_size (MPI_COMM_WORLD, &size);
fixture->global_size = size;
fixture->rank = rank;
if (fixture->rank == 0) {
g_message ("Number of mpi processes: %d", fixture->global_size);
g_message ("Number of remote_nodes: %d", fixture->global_size - 1);
fixture->remote_nodes = g_malloc0 (fixture->global_size - 1);
// create remote nodes
for (int i = 0; i < fixture->global_size - 1; i++) {
gchar *addr = g_strdup_printf("%d", i+1);
fixture->remote_nodes[i] = (UfoRemoteNode *) ufo_remote_node_new (addr);
}
} else {
gchar *addr = g_strdup_printf("%d", rank);
fixture->daemon = ufo_daemon_new (fixture->config, addr);
ufo_daemon_start (fixture->daemon);
}
}
static void
teardown (Fixture *fixture, gconstpointer data)
{
g_message ("teardown");
if (fixture->rank == 0) {
for (int i = 1; i <= fixture->global_size - 1; i++) {
UfoRemoteNode *node = fixture->remote_nodes[i-1];
ufo_remote_node_terminate (node);
g_object_unref (node);
g_message ("teardown node %d done", i-1);
}
} else {
ufo_daemon_wait_finish (fixture->daemon);
g_object_unref (fixture->daemon);
g_message ("teardown done");
}
}
static void
test_remote_node_get_num_cpus (Fixture *fixture,
gconstpointer unused)
{
if (fixture->rank == 0) {
for (int i = 1; i <= fixture->global_size - 1; i++) {
guint n_gpus = ufo_remote_node_get_num_gpus (fixture->remote_nodes[i-1]);
g_message ("Found %d number of GPUs at remotenode %d", n_gpus, i);
g_assert (n_gpus > 0);
}
}
}
static void
test_remote_node_get_structure (Fixture *fixture,
gconstpointer unused)
{
if (fixture->rank == 0) {
for (int i = 1; i <= fixture->global_size - 1 ; i++) {
UfoTaskMode mode;
UfoInputParam *in_params;
guint n_inputs;
ufo_remote_node_get_structure (fixture->remote_nodes[i-1], &n_inputs, &in_params, &mode);
g_message ("received n_inputs == %d from remote node %d", n_inputs, i);
g_assert (n_inputs == 1);
g_message ("received n_dims == %d from remote node %d", in_params->n_dims, i);
g_assert (in_params->n_dims == 2);
}
}
}
void
test_add_mpi_remote_node (void)
{
g_test_add ("/remotenode/get_structure",
Fixture, NULL,
setup, test_remote_node_get_structure, teardown);
g_test_add ("/remotenode/get_num_cpus",
Fixture, NULL,
setup, test_remote_node_get_num_cpus, teardown);
}