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