table {
width: 100%;
border-collapse: collapse;
margin-top: 1em;
}
th, td {
border: 1px solid #ccc;
padding: 8px;
text-align: center;
}
th {
background: #5b9bd5;
color: white;
}
input[type=”number”] {
width: 80px;
}
tr.group-header td {
background: #fff2cc;
font-weight: bold;
text-align: left;
}
Compute Charges Estimator – estimate and output as pdf (confirmation needed with ICDS)
ICDS Services Quote – CY25 | ||||||||
PI: | Start | |||||||
End | ||||||||
Service / Resources | Academic Prices* (incur F&A)** | Credit price: $ | ||||||
COMPUTE CREDITS | Conversion Multiplier | Cores / Job | Hours / Job | # of Jobs | # Hours Required | Unit Cost / Hr | PI Cost ($) | Credits Required |
---|---|---|---|---|---|---|---|---|
RC Basic Compute | 0 | 0 | 0 | 0 | 0 | |||
RC Standard Compute | 0 | 0 | 0 | 0 | 0 | |||
RC High Memory Cores | 0 | 0 | 0 | 0 | 0 | |||
RC P100 Single GPU (ADD std cores) | 0 | 0 | 0 | 0 | 0 | |||
RC A100 Single GPU (per card) (ADD std cores) | 0 | 0 | 0 | 0 | 0 | |||
Half A100 GPU Card (per 1/2 card) (ADD std cores) | 0 | 0 | 0 | 0 | 0 | |||
Multi-Instance A100 GPU Slice (ADD std cores) | 0 | 0 | 0 | 0 | 0 | |||
RC GPU A40 (ADD std cores) | 0 | 0 | 0 | 0 | 0 | |||
RC GPU V100 (ADD std cores) | 0 | 0 | 0 | 0 | 0 | |||
TOTAL PI Funds | $0.00 |
const compute_credit_price = 1.81;
function updateComputeCredits() {
const Conversion_mult = {
“RC Basic Compute”: 1.0,
“RC Standard Compute”: 1.86,
“RC High Memory Cores”: 3.24,
“RC P100 Single GPU (ADD std cores)”: 6.25,
“RC A100 Single GPU (per card) (ADD std cores)”: 62.5,
“Half A100 GPU Card (per 1/2 card) (ADD std cores)”: 31.23,
“Multi-Instance A100 GPU Slice (ADD std cores)”: 8.92,
“RC GPU A40 (ADD std cores)”: 73.33,
“RC GPU V100 (ADD std cores)”: 31.63,
};
const rows = document.querySelectorAll(“#compute-credits tr”);
rows.forEach(row => {
const labelCell = row.querySelector(“td”);
if (!labelCell) return;
const label = labelCell.textContent.trim();
const cores = parseFloat(row.querySelector(“.cores”)?.value) || 0;
const hours = parseFloat(row.querySelector(“.hours”)?.value) || 0;
const jobs = parseFloat(row.querySelector(“.jobs”)?.value) || 0;
const multiplier = Conversion_mult[label] || 0;
const totalHours = cores * hours * jobs;
const unitCostPerHour = (compute_credit_price * multiplier) / (30 * 24);
const piCost = unitCostPerHour * totalHours;
const credits = piCost / compute_credit_price;
row.querySelector(“.conversion_mult”).innerText = multiplier.toFixed(2);
row.querySelector(“.total_hours”).innerText = totalHours.toFixed(2);
row.querySelector(“.unit_cost”).innerText = unitCostPerHour.toFixed(4);
row.querySelector(“.pi_cost”).innerText = piC ost.toFixed(2);
row.querySelector(“.credits”).innerText = credits.toFixed(2);
});
}
function updateAllCosts() {
updateComputeCredits();
}
document.querySelectorAll(“input”).forEach(input => {
input.addEventListener(“input”, updateAllCosts);
});
window.addEventListener(“DOMContentLoaded”, () => {
document.getElementById(“credit_price_display”).innerText = compute_credit_price.toFixed(2);
updateAllCosts();
});