git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3649
48e7efb5-ca39-0410-a469-
dd3cf9ba447f
void SIMIX_mutex_unlock(smx_mutex_t mutex)
{
smx_process_t p; /*process to wake up */
void SIMIX_mutex_unlock(smx_mutex_t mutex)
{
smx_process_t p; /*process to wake up */
xbt_assert0((mutex != NULL), "Invalid parameters");
xbt_assert0((mutex != NULL), "Invalid parameters");
if (xbt_swag_size(mutex->sleeping) > 0) {
p = xbt_swag_extract(mutex->sleeping);
mutex->using = 0;
if (xbt_swag_size(mutex->sleeping) > 0) {
p = xbt_swag_extract(mutex->sleeping);
mutex->using = 0;
SRCDIR=./src
BINDIR=./bin
LIBDIR=./lib
SRCDIR=./src
BINDIR=./bin
LIBDIR=./lib
mkdir -p $(LIBDIR)
$(BUILDDIR)/smpi_base.o: src/smpi_base.c include/smpi.h Makefile $(BUILDDIR)
mkdir -p $(LIBDIR)
$(BUILDDIR)/smpi_base.o: src/smpi_base.c include/smpi.h Makefile $(BUILDDIR)
- $(CC) $(CFLAGS) -c -I ../include -I $(INCLUDEDIR) -I ${SIMGRID_HOME}/include src/smpi_base.c -o $(BUILDDIR)/smpi_base.o
+ $(CC) $(CFLAGS) -c -I .. -I ../include -I $(INCLUDEDIR) -I ${SIMGRID_HOME}/include src/smpi_base.c -o $(BUILDDIR)/smpi_base.o
$(BUILDDIR)/smpi_mpi.o: src/smpi_mpi.c include/smpi.h Makefile $(BUILDDIR)
$(BUILDDIR)/smpi_mpi.o: src/smpi_mpi.c include/smpi.h Makefile $(BUILDDIR)
- $(CC) $(CFLAGS) -c -I ../include -I $(INCLUDEDIR) -I ${SIMGRID_HOME}/include src/smpi_mpi.c -o $(BUILDDIR)/smpi_mpi.o
+ $(CC) $(CFLAGS) -c -I .. -I ../include -I $(INCLUDEDIR) -I ${SIMGRID_HOME}/include src/smpi_mpi.c -o $(BUILDDIR)/smpi_mpi.o
$(BUILDDIR):
mkdir -p $(BUILDDIR)
$(BUILDDIR):
mkdir -p $(BUILDDIR)
struct smpi_mpi_communicator_t {
int size;
int barrier;
struct smpi_mpi_communicator_t {
int size;
int barrier;
+ smx_mutex_t barrier_mutex;
+ smx_cond_t barrier_cond;
smx_host_t *hosts;
smx_process_t *processes;
};
smx_host_t *hosts;
smx_process_t *processes;
};
LINKARGS=""
CMDLINE="${CMDLINE} -c "
elif [ "${ARG%.c}" != "${ARG}" ]; then
LINKARGS=""
CMDLINE="${CMDLINE} -c "
elif [ "${ARG%.c}" != "${ARG}" ]; then
- INCLUDEARGS="-I ../include -I${SMPI_INCLUDE} -I${SIMGRID_INCLUDE} "
+ INCLUDEARGS="-I .. -I ../include -I${SMPI_INCLUDE} -I${SIMGRID_INCLUDE} "
SRCFILE="$(realpath ${ARG})"
modsource ${SRCFILE}
CMDLINE="${CMDLINE} ${TMPDIR}${SRCFILE} "
SRCFILE="$(realpath ${ARG})"
modsource ${SRCFILE}
CMDLINE="${CMDLINE} ${TMPDIR}${SRCFILE} "
-PLATFORMTMP="$(mktemp tmpXXXXXX)"
-#PLATFORMTMP="pla.xml"
+#PLATFORMTMP="$(mktemp tmpXXXXXX)"
+PLATFORMTMP="pla.xml"
cat > ${PLATFORMTMP} <<PLATFORMHEAD
<?xml version='1.0'?>
cat > ${PLATFORMTMP} <<PLATFORMHEAD
<?xml version='1.0'?>
</platform_description>
PLATFORMFOOT
</platform_description>
PLATFORMFOOT
-APPLICATIONTMP="$(mktemp tmpXXXXXX)"
-#APPLICATIONTMP="app.xml"
+#APPLICATIONTMP="$(mktemp tmpXXXXXX)"
+APPLICATIONTMP="app.xml"
cat > ${APPLICATIONTMP} <<APPLICATIONHEAD
<?xml version='1.0'?>
cat > ${APPLICATIONTMP} <<APPLICATIONHEAD
<?xml version='1.0'?>
APPLICATIONHEAD
for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
APPLICATIONHEAD
for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
- echo " <process host=\"host$i\" function=\"smpi_main\">" >> ${APPLICATIONTMP}
+ echo " <process host=\"host$i\" function=\"smpi_simulated_main\">" >> ${APPLICATIONTMP}
for ARG in $*; do
echo " <argument value=\"${ARG}\"/>" >> ${APPLICATIONTMP}
done
echo " </process>" >> ${APPLICATIONTMP}
done
for ARG in $*; do
echo " <argument value=\"${ARG}\"/>" >> ${APPLICATIONTMP}
done
echo " </process>" >> ${APPLICATIONTMP}
done
-for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
- echo " <process host=\"host$i\" function=\"smpi_sender\"/>" >> ${APPLICATIONTMP}
-done
-
-for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
- echo " <process host=\"host$i\" function=\"smpi_receiver\"/>" >> ${APPLICATIONTMP}
-done
+#for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
+# echo " <process host=\"host$i\" function=\"smpi_sender\"/>" >> ${APPLICATIONTMP}
+# echo " <process host=\"host$i\" function=\"smpi_receiver\"/>" >> ${APPLICATIONTMP}
+#done
cat >> ${APPLICATIONTMP} <<APPLICATIONFOOT
</platform_description>
APPLICATIONFOOT
${EXEC} ${PLATFORMTMP} ${APPLICATIONTMP}
cat >> ${APPLICATIONTMP} <<APPLICATIONFOOT
</platform_description>
APPLICATIONFOOT
${EXEC} ${PLATFORMTMP} ${APPLICATIONTMP}
-rm ${PLATFORMTMP} ${APPLICATIONTMP}
+#rm ${PLATFORMTMP} ${APPLICATIONTMP}
XBT_LOG_NEW_DEFAULT_CATEGORY(smpi, "SMPI");
XBT_LOG_NEW_DEFAULT_CATEGORY(smpi, "SMPI");
+// mutexes
+smx_mutex_t smpi_running_hosts_mutex;
+
+int smpi_sender(int argc, char **argv)
+int smpi_receiver(int argc, char **argv)
}
int smpi_run_simulation(int argc, char **argv)
}
int smpi_run_simulation(int argc, char **argv)
smx_host_t host;
double duration;
smx_host_t host;
double duration;
- // FIXME: mutex?
- smpi_running_hosts++;
-
// initialize some local variables
host = SIMIX_host_self();
hosts = SIMIX_host_get_table();
// initialize some local variables
host = SIMIX_host_self();
hosts = SIMIX_host_get_table();
// node 0 sets the globals
if (host == hosts[0]) {
// node 0 sets the globals
if (host == hosts[0]) {
+ // mutexes
+ smpi_running_hosts_mutex = SIMIX_mutex_init();
+
- smpi_mpi_comm_world.size = size;
- smpi_mpi_comm_world.barrier = 0;
- smpi_mpi_comm_world.hosts = hosts;
- smpi_mpi_comm_world.processes = xbt_new0(smx_process_t, size);
- smpi_mpi_comm_world.processes[0] = SIMIX_process_self();
+ smpi_mpi_comm_world.size = size;
+ smpi_mpi_comm_world.barrier = 0;
+ smpi_mpi_comm_world.barrier_mutex = SIMIX_mutex_init();
+ smpi_mpi_comm_world.barrier_cond = SIMIX_cond_init();
+ smpi_mpi_comm_world.hosts = hosts;
+ smpi_mpi_comm_world.processes = xbt_new0(smx_process_t, size);
+ smpi_mpi_comm_world.processes[0] = SIMIX_process_self();
- smpi_mpi_byte.size = (size_t)1;
- smpi_mpi_int.size = sizeof(int);
- smpi_mpi_double.size = sizeof(double);
+ smpi_mpi_byte.size = (size_t)1;
+ smpi_mpi_int.size = sizeof(int);
+ smpi_mpi_double.size = sizeof(double);
- smpi_mpi_land.func = &smpi_mpi_land_func;
- smpi_mpi_sum.func = &smpi_mpi_sum_func;
+ smpi_mpi_land.func = &smpi_mpi_land_func;
+ smpi_mpi_sum.func = &smpi_mpi_sum_func;
- smpi_pending_send_requests = xbt_new0(xbt_fifo_t, size);
- smpi_pending_recv_requests = xbt_new0(xbt_fifo_t, size);
- smpi_received_messages = xbt_new0(xbt_fifo_t, size);
+ smpi_pending_send_requests = xbt_new0(xbt_fifo_t, size);
+ smpi_pending_recv_requests = xbt_new0(xbt_fifo_t, size);
+ smpi_received_messages = xbt_new0(xbt_fifo_t, size);
for(i = 0; i < size; i++) {
smpi_pending_send_requests[i] = xbt_fifo_new();
for(i = 0; i < size; i++) {
smpi_pending_send_requests[i] = xbt_fifo_new();
// FIXME: signal node 0
// FIXME: wait for node 0
}
// FIXME: signal node 0
// FIXME: wait for node 0
}
+
+ SIMIX_mutex_lock(smpi_running_hosts_mutex);
+ smpi_running_hosts++;
+ SIMIX_mutex_lock(smpi_running_hosts_mutex);
}
void smpi_mpi_finalize()
{
int i;
}
void smpi_mpi_finalize()
{
int i;
- // FIXME: mutex?
- smpi_running_hosts--;
+ SIMIX_mutex_lock(smpi_running_hosts_mutex);
+ i = --smpi_running_hosts;
+ SIMIX_mutex_unlock(smpi_running_hosts_mutex);
+
+ if (0 >= i) {
+
+ SIMIX_mutex_destroy(smpi_running_hosts_mutex);
- if (0 >= smpi_running_hosts) {
for (i = 0 ; i < smpi_mpi_comm_world.size; i++) {
xbt_fifo_free(smpi_pending_send_requests[i]);
xbt_fifo_free(smpi_pending_recv_requests[i]);
xbt_fifo_free(smpi_received_messages[i]);
}
for (i = 0 ; i < smpi_mpi_comm_world.size; i++) {
xbt_fifo_free(smpi_pending_send_requests[i]);
xbt_fifo_free(smpi_pending_recv_requests[i]);
xbt_fifo_free(smpi_received_messages[i]);
}
xbt_free(smpi_pending_send_requests);
xbt_free(smpi_pending_recv_requests);
xbt_free(smpi_received_messages);
xbt_free(smpi_mpi_comm_world.processes);
xbt_os_timer_free(smpi_timer);
}
xbt_free(smpi_pending_send_requests);
xbt_free(smpi_pending_recv_requests);
xbt_free(smpi_received_messages);
xbt_free(smpi_mpi_comm_world.processes);
xbt_os_timer_free(smpi_timer);
}
}
void smpi_bench_begin()
}
void smpi_bench_begin()
void smpi_barrier(smpi_mpi_communicator_t *comm) {
int i;
void smpi_barrier(smpi_mpi_communicator_t *comm) {
int i;
+ SIMIX_mutex_lock(comm->barrier_mutex);
- if(comm->barrier < comm->size) {
- SIMIX_process_suspend(SIMIX_process_self());
+ if(i < comm->size) {
+ SIMIX_cond_wait(comm->barrier_cond, comm->barrier_mutex);
} else {
comm->barrier = 0;
} else {
comm->barrier = 0;
- for(i = 0; i < comm->size; i++) {
- if (SIMIX_process_is_suspended(comm->processes[i])) {
- SIMIX_process_resume(comm->processes[i]);
- }
- }
+ SIMIX_cond_broadcast(comm->barrier_cond);
+ SIMIX_mutex_unlock(comm->barrier_mutex);
}
int smpi_comm_rank(smpi_mpi_communicator_t *comm, smx_host_t host)
}
int smpi_comm_rank(smpi_mpi_communicator_t *comm, smx_host_t host)
// FIXME: simix sleep
self = SIMIX_host_self();
sleep_action = SIMIX_action_sleep(self, seconds);
// FIXME: simix sleep
self = SIMIX_host_self();
sleep_action = SIMIX_action_sleep(self, seconds);
smpi_bench_begin();
return 0;
}
smpi_bench_begin();
return 0;
}
void smpi_exit(int status)
{
smpi_bench_end();
void smpi_exit(int status)
{
smpi_bench_end();
+ SIMIX_mutex_lock(smpi_running_hosts_mutex);
+ SIMIX_mutex_unlock(smpi_running_hosts_mutex);
SIMIX_process_kill(SIMIX_process_self());
return;
}
SIMIX_process_kill(SIMIX_process_self());
return;
}