Compare commits

...

4 Commits

18 changed files with 152 additions and 39 deletions

View File

@ -53,8 +53,8 @@ SWIFT_MIN_CWND 0.001
SWIFT_MAX_CWND 20000
SWIFT_TARGET_ENDPOINT_DELAY 1000000
RTT_QCN_T_MIN 5000
RTT_QCN_T_MAX 9000
RTT_QCN_T_MIN 10000
RTT_QCN_T_MAX 13000
RTT_QCN_ALPHA 0.5
RTT_QCN_BETA 0.25

View File

@ -22,8 +22,8 @@ os.makedirs(plots_dir,exist_ok=True)
plt.rcParams.update({'font.size': 18,'font.family':'Source Han Sans'})
algs=list(["powerDelay", "timely","patchedTimely","swift","rttqcn"])
algnames={"dcqcn":"DCQCN","powerInt":"PowerTCP","hpcc":"HPCC","powerDelay":r'$\theta-PowerTCP$',"timely":"TIMELY","DCTCP":"DCTCP","patchedTimely":"Patched TIMELY","swift":"Swift","rttqcn":"RTT-QCN"}
algs=list(["powerDelay", "timely","patchedTimely","swift","rttqcn","powerqcn"])
algnames={"dcqcn":"DCQCN","powerInt":"PowerTCP","hpcc":"HPCC","powerDelay":"θ-PowerTCP","timely":"TIMELY","DCTCP":"DCTCP","patchedTimely":"Patched TIMELY","swift":"Swift","rttqcn":"RTT-QCN","powerqcn":"PowerQCN"}
#%%

View File

@ -23,8 +23,8 @@ plt.rcParams.update({'font.size': 18,'font.family':'Source Han Sans'})
algs=list(["powerDelay", "timely","patchedTimely","swift","rttqcn"])
algnames={"dcqcn":"DCQCN","powerInt":"PowerTCP","hpcc":"HPCC","powerDelay":r'$\theta-PowerTCP$',"timely":"TIMELY","DCTCP":"DCTCP","patchedTimely":"Patched TIMELY","swift":"Swift","rttqcn":"RTT-QCN"}
algs=list(["powerDelay", "timely","patchedTimely","swift","rttqcn","powerqcn"])
algnames={"dcqcn":"DCQCN","powerInt":"PowerTCP","hpcc":"HPCC","powerDelay":"θ-PowerTCP","timely":"TIMELY","DCTCP":"DCTCP","patchedTimely":"Patched TIMELY","swift":"Swift","rttqcn":"RTT-QCN","powerqcn":"PowerQCN"}
######## FAIRNESS #############

View File

@ -23,8 +23,8 @@ plt.rcParams.update({'font.size': 18,'font.family':'Source Han Sans'})
algs=list(["dcqcn", "powerInt", "hpcc", "powerDelay", "timely", "dctcp","patchedTimely","swift","rttqcn"])
algnames={"dcqcn":"DCQCN","powerInt":"PowerTCP","hpcc":"HPCC","powerDelay":"θ-PowerTCP","timely":"TIMELY","DCTCP":"DCTCP","patchedTimely":"Patched TIMELY","swift":"Swift","rttqcn":"RTT-QCN"}
algs=list(["powerDelay", "timely","patchedTimely","swift","rttqcn","powerqcn"])
algnames={"dcqcn":"DCQCN","powerInt":"PowerTCP","hpcc":"HPCC","powerDelay":"θ-PowerTCP","timely":"TIMELY","DCTCP":"DCTCP","patchedTimely":"Patched TIMELY","swift":"Swift","rttqcn":"RTT-QCN","powerqcn":"PowerQCN"}
#%%

View File

@ -1073,6 +1073,7 @@ main(int argc, char* argv[])
case CC_MODE::TIMELY:
case CC_MODE::PATCHED_TIMELY:
case CC_MODE::RTT_QCN:
case CC_MODE::POWERQCN:
// timely or patched timely, use ts
IntHeader::mode = IntHeader::TS;
break;

View File

@ -1056,6 +1056,7 @@ main(int argc, char* argv[])
case CC_MODE::TIMELY:
case CC_MODE::PATCHED_TIMELY:
case CC_MODE::RTT_QCN:
case CC_MODE::POWERQCN:
// timely or patched timely, use ts
IntHeader::mode = IntHeader::TS;
break;

View File

@ -1317,6 +1317,7 @@ main(int argc, char* argv[])
case CC_MODE::TIMELY:
case CC_MODE::PATCHED_TIMELY:
case CC_MODE::RTT_QCN:
case CC_MODE::POWERQCN:
// timely or patched timely, use ts
IntHeader::mode = IntHeader::TS;
break;

View File

@ -5,10 +5,10 @@ RES_RESULTS=$NS3/examples/PowerTCP/results_burst
mkdir $RES_DUMP
mkdir $RES_RESULTS
algs=(3 4 6 7 8)
algs=(3 4 6 7 8 9)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn" "powerqcn")
CCMODE=(1 3 3 3 7 8 11 12 13 14)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -6,10 +6,10 @@ RES_RESULTS=$NS3/examples/PowerTCP/results_fairness
mkdir $RES_DUMP
mkdir $RES_RESULTS
algs=(3 4 6 7 8)
algs=(3 4 6 7 8 9)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn" "powerqcn")
CCMODE=(1 3 3 3 7 8 11 12 13 14)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -4,10 +4,10 @@ RES_RESULTS=$NS3/examples/PowerTCP/results_workload
mkdir $RES_DUMP
mkdir $RES_RESULTS
algs=(0 1 2 3 4 5 6 7 8)
algs=(3 4 6 7 8 9)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn" "powerqcn")
CCMODE=(1 3 3 3 7 8 11 12 13 14)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -6,10 +6,10 @@ MIX_DUMP=$NS3/examples/PowerTCP/mix
mkdir $RES_DUMP
mkdir $MIX_DUMP
algs=(3 4 6 7 8)
algs=(3 4 6 7 8 9)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn" "powerqcn")
CCMODE=(1 3 3 3 7 8 11 12 13 14)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -6,10 +6,10 @@ MIX_DUMP=$NS3/examples/PowerTCP/mix
mkdir $RES_DUMP
mkdir $MIX_DUMP
algs=(3 4 6 7 8)
algs=(3 4 6 7 8 9)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn" "powerqcn")
CCMODE=(1 3 3 3 7 8 11 12 13 14)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -8,10 +8,10 @@ mkdir $RES_DUMP
mkdir $MIX_DUMP
mkdir $RES_RESULTS
# algs=(0 1 2 3 4 5 6 7 8)
algs=(3 4 6 7 8)
algs=(3 4 6 7 8 9)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn" "powerqcn")
CCMODE=(1 3 3 3 7 8 11 12 13 14)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -8,10 +8,10 @@ mkdir $RES_DUMP
mkdir $MIX_DUMP
mkdir $RES_RESULTS
# algs=(0 1 2 3 4 5 6 7 8)
algs=(3 4 6 7 8)
algs=(3 4 6 7 8 9)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn" "powerqcn")
CCMODE=(1 3 3 3 7 8 11 12 13 14)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -8,10 +8,10 @@ mkdir $RES_DUMP
mkdir $MIX_DUMP
mkdir $RES_RESULTS
# algs=(0 1 2 3 4 5 6 7 8)
algs=(3 4 6 7 8)
algs=(3 4 6 7 8 9)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn" "powerqcn")
CCMODE=(1 3 3 3 7 8 11 12 13 14)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -8,10 +8,10 @@ mkdir $RES_DUMP
mkdir $MIX_DUMP
mkdir $RES_RESULTS
# algs=(0 1 2 3 4 5 6 7 8)
algs=(3 4 6 7 8)
algs=(3 4 6 7 8 9)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn" "powerqcn")
CCMODE=(1 3 3 3 7 8 11 12 13 14)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -23,6 +23,7 @@
#include <cstdint>
#include <iostream>
#include <ostream>
#include <random>
namespace ns3
{
@ -690,7 +691,11 @@ RdmaHw::ReceiveAck(Ptr<Packet> p, CustomHeader& ch)
case CC_MODE::RTT_QCN:
HandleAckRttQcn(qp, p, ch);
break;
case CC_MODE::POWERQCN:
HandleAckPowerQcn(qp, p, ch);
break;
default:
NS_ABORT_MSG("Unknown CC mode");
break;
}
// ACK may advance the on-the-fly window, allowing more packets to send
@ -2135,6 +2140,9 @@ void
RdmaHw::HandleAckRttQcn(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch) const
{
uint64_t rtt = Simulator::Now().GetTimeStep() - ch.ack.ih.GetTs();
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> distr(0, 1000);
bool ecn = false;
if (rtt <= rtt_qcn_tmin)
{
@ -2143,7 +2151,7 @@ RdmaHw::HandleAckRttQcn(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch)
else if (rtt <= rtt_qcn_tmax)
{
auto thresh = (rtt - rtt_qcn_tmin) * 1000.0 / (rtt_qcn_tmax - rtt_qcn_tmin);
auto rand_num = rand() % 1000;
auto rand_num = distr(gen);
ecn = rand_num < thresh;
}
else
@ -2182,4 +2190,97 @@ RdmaHw::HandleAckRttQcn(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch)
qp->m_win = (uint32_t)cwnd;
}
void
RdmaHw::HandleAckPowerQcn(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch)
{
uint64_t rtt = Simulator::Now().GetTimeStep() - ch.ack.ih.GetTs();
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> distr(0, 1000);
uint64_t prev_rtt = powerqcn_prev_rtt == 0 ? rtt : powerqcn_prev_rtt;
if (powerqcn_last_update < ch.ack.ih.GetTs())
{
powerqcn_prev_rtt = rtt;
powerqcn_last_update = Simulator::Now().GetTimeStep();
}
double rtt_gradient = (rtt - prev_rtt) / rtt_qcn_tmin;
bool rtt_ecn = false;
if (rtt <= rtt_qcn_tmin)
{
rtt_ecn = false;
}
else if (rtt <= rtt_qcn_tmax)
{
auto thresh = (rtt - rtt_qcn_tmin) * 1000.0 / (rtt_qcn_tmax - rtt_qcn_tmin);
auto rand_num = distr(gen);
rtt_ecn = rand_num < thresh;
}
else
{
rtt_ecn = true;
}
bool gradient_ecn = false;
if (rtt_gradient <= -0.25)
{
gradient_ecn = false;
}
// else if (rtt_gradient <= 0.25)
// {
// auto thresh = (rtt_gradient + 0.25) * 1000.0 / 0.5;
// auto rand_num = distr(gen);
// gradient_ecn = rand_num < thresh;
// }
else
{
gradient_ecn = true;
}
// window in mtu (1000), not in bytes / seq#
auto cwnd = qp->rttqcn.curr_win;
if (cwnd < m_mtu)
{
if (rtt_ecn)
{
cwnd *= 1 - rtt_qcn_beta;
}
else
{
cwnd += rtt_qcn_alpha * m_mtu;
}
}
else
{
if (rtt_ecn)
{
// cwnd -= 0.5 * m_mtu;
if (gradient_ecn)
{
cwnd -= 0.7 * m_mtu;
}
else
{
cwnd -= 0.5 * m_mtu;
}
}
if (!rtt_ecn)
{
// cwnd += m_mtu * 10.0 / cwnd;
if (gradient_ecn)
{
cwnd += m_mtu * 8.0 / cwnd;
}
else
{
cwnd += m_mtu * 20.0 / cwnd;
}
}
}
std::cout << "[RTT-QCN] node: " << m_node->GetId() << ", cwnd: " << qp->rttqcn.curr_win << "->"
<< cwnd << ", RTT: " << rtt << ", ecn: " << rtt_ecn << gradient_ecn << std::endl;
qp->rttqcn.curr_win = cwnd;
qp->m_win = (uint32_t)cwnd;
}
} // namespace ns3

View File

@ -227,13 +227,21 @@ class RdmaHw : public Object
/*********************
* RTT-QCN
********************/
uint64_t rtt_qcn_tmin; // max rtt value to generate no ecn
uint64_t rtt_qcn_tmax; // min rtt value to always generate ecn
uint64_t rtt_qcn_tmin; // max rtt value to generate NO ecn
uint64_t rtt_qcn_tmax; // min rtt value to ALWAYS generate ecn
double
rtt_qcn_alpha; // additive increase when cwnd < 1; use original value, don't multiply by mtu
double rtt_qcn_beta; // multiplicative decrease when cwnd > 1; use original value, don't
// multiply by mtu
void HandleAckRttQcn(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch) const;
/*********************
* PowerQCN
* Improve RTT-QCN by using gradient alongside RTT
********************/
uint64_t powerqcn_prev_rtt = 0; // previous RTT, used to calculate gradient
uint64_t powerqcn_last_update = 0; // last time we update prev_rtt
void HandleAckPowerQcn(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch);
};
enum CC_MODE
@ -247,7 +255,8 @@ enum CC_MODE
HPCC_PINT = 10,
PATCHED_TIMELY = 11,
SWIFT = 12,
RTT_QCN = 13
RTT_QCN = 13,
POWERQCN = 14,
};
} /* namespace ns3 */