X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0090ea7fd5569795fcbbc08b481d593a9355cd4a..a4ab179f11ae2afec1467c4ca9256fc5ba6fa85b:/src/smpi/smpi_bench.cpp diff --git a/src/smpi/smpi_bench.cpp b/src/smpi/smpi_bench.cpp index adbbd3d441..3b01c90dce 100644 --- a/src/smpi/smpi_bench.cpp +++ b/src/smpi/smpi_bench.cpp @@ -1,5 +1,4 @@ -/* Copyright (c) 2007, 2009-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2007, 2009-2017. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -21,11 +20,11 @@ #include "simgrid/modelchecker.h" #include "src/mc/mc_replay.h" +#include #ifndef WIN32 #include #endif #include -#include #include #include #include // sqrt @@ -80,7 +79,7 @@ xbt_dict_t samples = nullptr; /* Allocated on first use */ xbt_dict_t calls = nullptr; /* Allocated on first use */ double smpi_cpu_threshold; -double smpi_running_power; +double smpi_host_speed; int smpi_loaded_page = -1; char* smpi_start_data_exe = nullptr; @@ -165,7 +164,6 @@ static size_t shm_size(int fd) { #ifndef WIN32 static void* shm_map(int fd, size_t size, shared_data_key_type* data) { - void* mem; char loc[PTR_STRLEN]; shared_metadata_t meta; @@ -173,9 +171,14 @@ static void* shm_map(int fd, size_t size, shared_data_key_type* data) { xbt_die("Could not truncate fd %d to %zu: %s", fd, size, strerror(errno)); } - mem = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + void* mem = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(mem == MAP_FAILED) { - xbt_die("Could not map fd %d with size %zu: %s", fd, size, strerror(errno)); + xbt_die( + "Failed to map fd %d with size %zu: %s\n" + "If you are running a lot of ranks, you may be exceeding the amount of mappings allowed per process.\n" + "On Linux systems, change this value with sudo sysctl -w vm.max_map_count=newvalue (default value: 65536)\n" + "Please see http://simgrid.gforge.inria.fr/simgrid/latest/doc/html/options.html#options_virt for more info.", + fd, size, strerror(errno)); } snprintf(loc, PTR_STRLEN, "%p", mem); meta.size = size; @@ -186,7 +189,7 @@ static void* shm_map(int fd, size_t size, shared_data_key_type* data) { } #endif -void smpi_bench_destroy(void) +void smpi_bench_destroy() { allocs.clear(); allocs_metadata.clear(); @@ -207,9 +210,8 @@ void smpi_execute_(double *duration) } void smpi_execute_flops(double flops) { - smx_synchro_t action; XBT_DEBUG("Handle real computation time: %f flops", flops); - action = simcall_execution_start("computation", flops, 1, 0, 0); + smx_activity_t action = simcall_execution_start("computation", flops, 1, 0); simcall_set_category (action, TRACE_internal_smpi_get_category()); simcall_execution_wait(action); smpi_switch_data_segment(smpi_process_index()); @@ -219,12 +221,13 @@ void smpi_execute(double duration) { if (duration >= smpi_cpu_threshold) { XBT_DEBUG("Sleep for %g to handle real computation time", duration); - double flops = duration * smpi_running_power; + double flops = duration * smpi_host_speed; int rank = smpi_process_index(); instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); extra->type=TRACING_COMPUTING; extra->comp_size=flops; TRACE_smpi_computing_in(rank, extra); + smpi_execute_flops(flops); TRACE_smpi_computing_out(rank); @@ -235,7 +238,7 @@ void smpi_execute(double duration) } } -void smpi_bench_begin(void) +void smpi_bench_begin() { if (smpi_privatize_global_variables) { smpi_switch_data_segment(smpi_process_index()); @@ -260,7 +263,7 @@ void smpi_bench_begin(void) xbt_os_threadtimer_start(smpi_process_timer()); } -void smpi_bench_end(void) +void smpi_bench_end() { if (MC_is_active() || MC_record_replay_is_active()) return; @@ -403,7 +406,7 @@ int smpi_clock_gettime(clockid_t clk_id, struct timespec *tp) #endif extern double sg_surf_precision; -unsigned long long smpi_rastro_resolution (void) +unsigned long long smpi_rastro_resolution () { smpi_bench_end(); double resolution = (1/sg_surf_precision); @@ -411,7 +414,7 @@ unsigned long long smpi_rastro_resolution (void) return static_cast(resolution); } -unsigned long long smpi_rastro_timestamp (void) +unsigned long long smpi_rastro_timestamp () { smpi_bench_end(); double now = SIMIX_get_clock(); @@ -747,11 +750,15 @@ void smpi_initialize_global_memory_segments(){ for (int i=0; i< smpi_process_count(); i++){ //create SIMIX_process_count() mappings of this size with the same data inside + int file_descriptor; void *address = nullptr; - char path[] = "/dev/shm/my-buffer-XXXXXX"; + char path[24]; int status; - int file_descriptor= mkstemp (path); + do { + snprintf(path, sizeof(path), "/smpi-buffer-%06x", rand()%0xffffff); + file_descriptor = shm_open(path, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR); + } while (file_descriptor == -1 && errno == EEXIST); if (file_descriptor < 0) { if (errno==EMFILE) { xbt_die("Impossible to create temporary file for memory mapping: %s\n\ @@ -772,10 +779,6 @@ Ask the Internet about tutorials on how to increase the files limit such as: htt strerror(errno)); } - status = unlink (path); - if (status) - xbt_die("Impossible to unlink temporary file for memory mapping"); - status = ftruncate(file_descriptor, smpi_size_data_exe); if(status) xbt_die("Impossible to set the size of the temporary file for memory mapping"); @@ -785,6 +788,10 @@ Ask the Internet about tutorials on how to increase the files limit such as: htt if (address == MAP_FAILED) xbt_die("Couldn't find a free region for memory mapping"); + status = shm_unlink(path); + if (status) + xbt_die("Impossible to unlink temporary file for memory mapping"); + //initialize the values memcpy(address, TOPAGE(smpi_start_data_exe), smpi_size_data_exe);