update experimental powerqcn

This commit is contained in:
Yupeng Chen 2024-04-27 21:24:46 +08:00
parent 6c9414926c
commit 7fcf45c6ec
No known key found for this signature in database
GPG Key ID: BB03A97DB67D4C16
17 changed files with 121 additions and 36 deletions

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,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

View File

@ -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 */