Compare commits
4 Commits
d87237bed8
...
b0ad890be2
Author | SHA1 | Date |
---|---|---|
Yupeng Chen | b0ad890be2 | |
Yupeng Chen | 3c52c8c823 | |
Yupeng Chen | 7fcf45c6ec | |
Yupeng Chen | 6c9414926c |
|
@ -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
|
||||
|
||||
|
|
|
@ -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,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
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue