168673Sobrien/** 2218822Sdim * \file 378828Sobrien * \brief 468673Sobrien */ 5218822Sdim 668673Sobrien/* 7218822Sdim * Copyright (c) 2007, 2008, 2009, ETH Zurich. 8218822Sdim * All rights reserved. 9218822Sdim * 10218822Sdim * This file is distributed under the terms in the attached LICENSE file. 1168673Sobrien * If you do not find this file, copies can be found by writing to: 12218822Sdim * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group. 13218822Sdim */ 14218822Sdim 15218822Sdim#include "ump_bench.h" 1668673Sobrien 17218822Sdim#define MAX_COUNT 100 18218822Sdimstatic struct timestamps *timestamps; 19218822Sdim 2068673Sobrienvoid experiment(coreid_t idx) 2168673Sobrien{ 2268673Sobrien timestamps = malloc(sizeof(struct timestamps) * MAX_COUNT); 2368673Sobrien assert(timestamps != NULL); 2468673Sobrien 2568673Sobrien struct bench_ump_binding *bu = (struct bench_ump_binding*)array[idx]; 2668673Sobrien struct flounder_ump_state *fus = &bu->ump_state; 2768673Sobrien struct ump_chan *chan = &fus->chan; 2868673Sobrien 2968673Sobrien struct ump_chan_state *send = &chan->send_chan; 3068673Sobrien struct ump_chan_state *recv = &chan->endpoint.chan; 3168673Sobrien 3268673Sobrien printf("Running throughput between core %d and core %d\n", 3368673Sobrien my_core_id, idx); 3468673Sobrien 3568673Sobrien volatile struct ump_message *msg; 3668673Sobrien struct ump_control ctrl; 3768673Sobrien for (int i = 0; i < NUM_MSGS; i++) { /* Fill up the buffer */ 3868673Sobrien while (!(msg = ump_impl_get_next(send, &ctrl))); 3968673Sobrien msg->header.control = ctrl; 4068673Sobrien } 4168673Sobrien 4268673Sobrien cycles_t ts = bench_tsc(); 4368673Sobrien for (int i = 0; i < MAX_COUNT; i++) { /* Sustained sending of msgs */ 4468673Sobrien timestamps[i].time0 = ts; 4568673Sobrien while (!(msg = ump_impl_recv(recv))); 4668673Sobrien ump_impl_free_message(msg); 4768673Sobrien ts = timestamps[i].time1 = bench_tsc(); 4868673Sobrien while (!(msg = ump_impl_get_next(send, &ctrl))); 4968673Sobrien msg->header.control = ctrl; 5068673Sobrien } 5168673Sobrien 5268673Sobrien for (int i = 0; i < NUM_MSGS; i++) { /* Empty the buffer */ 5368673Sobrien while (!(msg = ump_impl_recv(recv))); 5468673Sobrien ump_impl_free_message(msg); 5568673Sobrien } 5668673Sobrien 5768673Sobrien /* Print results */ 5868673Sobrien for (int i = 0; i < MAX_COUNT; i++) { 5968673Sobrien if (timestamps[i].time1 > timestamps[i].time0) { 6068673Sobrien printf("page %d took %"PRIuCYCLES"\n", i, 6168673Sobrien timestamps[i].time1 - bench_tscoverhead() - 6268673Sobrien timestamps[i].time0); 6368673Sobrien } 6468673Sobrien } 6568673Sobrien} 6668673Sobrien