update experimental powerqcn
This commit is contained in:
parent
6c9414926c
commit
7fcf45c6ec
|
@ -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"}
|
||||
|
||||
|
||||
#%%
|
||||
|
|
|
@ -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 #############
|
||||
|
|
|
@ -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"}
|
||||
|
||||
#%%
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <cstdint>
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
#include <random>
|
||||
|
||||
namespace ns3
|
||||
{
|
||||
|
@ -690,7 +691,10 @@ 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);
|
||||
default:
|
||||
NS_ABORT_MSG("Unknown CC mode");
|
||||
break;
|
||||
}
|
||||
// ACK may advance the on-the-fly window, allowing more packets to send
|
||||
|
@ -2185,4 +2189,74 @@ 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;
|
||||
double rtt_gradient = (rtt - prev_rtt) / rtt_qcn_tmin;
|
||||
double thresh = 0.0; // if rand(0,1000) < thresh, then ECN
|
||||
powerqcn_prev_rtt = rtt;
|
||||
// scale according to current RTT
|
||||
if (rtt <= rtt_qcn_tmin)
|
||||
{
|
||||
thresh = 0.0;
|
||||
}
|
||||
else if (rtt <= rtt_qcn_tmax)
|
||||
{
|
||||
thresh = (rtt - rtt_qcn_tmin) * 1000.0 / (rtt_qcn_tmax - rtt_qcn_tmin);
|
||||
}
|
||||
else
|
||||
{
|
||||
thresh = 1000.0;
|
||||
}
|
||||
// scale according to RTT gradient (% of min RTT)
|
||||
if (rtt_gradient <= 0)
|
||||
{
|
||||
thresh += 0.0;
|
||||
}
|
||||
else if (rtt_gradient >= 0.25)
|
||||
{
|
||||
thresh += 250.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
thresh += 1000.0 * rtt_gradient;
|
||||
}
|
||||
bool ecn = distr(gen) < thresh;
|
||||
// no worry if thresh is over 1000!
|
||||
// window in mtu (1000), not in bytes / seq#
|
||||
auto cwnd = qp->rttqcn.curr_win;
|
||||
if (cwnd < m_mtu)
|
||||
{
|
||||
if (ecn)
|
||||
{
|
||||
cwnd *= 1 - rtt_qcn_beta;
|
||||
}
|
||||
else
|
||||
{
|
||||
cwnd += rtt_qcn_alpha * m_mtu;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ecn)
|
||||
{
|
||||
cwnd -= 0.5 * m_mtu;
|
||||
}
|
||||
else
|
||||
{
|
||||
// attempt to improve: multiply by 10
|
||||
cwnd += m_mtu * 10.0 / cwnd;
|
||||
}
|
||||
}
|
||||
std::cout << "[RTT-QCN] node: " << m_node->GetId() << ", cwnd: " << qp->rttqcn.curr_win << "->"
|
||||
<< cwnd << ", RTT: " << rtt << ", ecn: " << ecn << std::endl;
|
||||
qp->rttqcn.curr_win = cwnd;
|
||||
qp->m_win = (uint32_t)cwnd;
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
|
|
|
@ -227,13 +227,20 @@ 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;
|
||||
void HandleAckPowerQcn(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch);
|
||||
};
|
||||
|
||||
enum CC_MODE
|
||||
|
@ -247,7 +254,8 @@ enum CC_MODE
|
|||
HPCC_PINT = 10,
|
||||
PATCHED_TIMELY = 11,
|
||||
SWIFT = 12,
|
||||
RTT_QCN = 13
|
||||
RTT_QCN = 13,
|
||||
POWERQCN = 14,
|
||||
};
|
||||
|
||||
} /* namespace ns3 */
|
||||
|
|
Loading…
Reference in New Issue