GPUKernelContest/example/cp_template/performance_utils.h

114 lines
4.9 KiB
C++

#pragma once
#include <iostream>
#include <iomanip>
#include <string>
// ============================================================================
// 性能计算和显示工具
// ============================================================================
class PerformanceCalculator {
public:
// ReduceSum性能计算
struct ReduceSumMetrics {
double throughput_gps; // G elements/s
};
static ReduceSumMetrics calculateReduceSum(int size, float time_ms) {
ReduceSumMetrics metrics;
metrics.throughput_gps = (size / 1e9) / (time_ms / 1000.0);
return metrics;
}
// SortPair性能计算
struct SortPairMetrics {
double throughput_gps; // G elements/s
};
static SortPairMetrics calculateSortPair(int size, float time_ms) {
SortPairMetrics metrics;
metrics.throughput_gps = (size / 1e9) / (time_ms / 1000.0);
return metrics;
}
// TopkPair性能计算
struct TopkPairMetrics {
double throughput_gps; // G elements/s
};
static TopkPairMetrics calculateTopkPair(int size, int k, float time_ms) {
TopkPairMetrics metrics;
metrics.throughput_gps = (size / 1e9) / (time_ms / 1000.0);
return metrics;
}
};
// ============================================================================
// 性能显示工具
// ============================================================================
class PerformanceDisplay {
public:
// 显示ReduceSum性能表头
static void printReduceSumHeader() {
std::cout << "\nReduceSum 性能测试..." << std::endl;
std::cout << "数据类型: float -> float" << std::endl;
std::cout << "计算公式:" << std::endl;
std::cout << " 吞吐量 = 元素数 / 时间(s) / 1e9 (G/s)" << std::endl;
std::cout << std::setw(12) << "数据规模" << std::setw(15) << "时间(ms)"
<< std::setw(20) << "吞吐量(G/s)" << std::endl;
std::cout << std::string(47, '-') << std::endl;
}
// 显示SortPair性能表头
static void printSortPairHeader() {
std::cout << "\nSortPair 性能测试..." << std::endl;
std::cout << "数据类型: <float, uint32_t>" << std::endl;
std::cout << "计算公式:" << std::endl;
std::cout << " 吞吐量 = 元素数 / 时间(s) / 1e9 (G/s)" << std::endl;
std::cout << std::setw(12) << "数据规模" << std::setw(15) << "升序(ms)" << std::setw(15) << "降序(ms)"
<< std::setw(16) << "升序(G/s)" << std::setw(16) << "降序(G/s)" << std::endl;
std::cout << std::string(78, '-') << std::endl;
}
// 显示TopkPair性能表头
static void printTopkPairHeader() {
std::cout << "\nTopkPair 性能测试..." << std::endl;
std::cout << "数据类型: <float, uint32_t>" << std::endl;
std::cout << "计算公式:" << std::endl;
std::cout << " 吞吐量 = 元素数 / 时间(s) / 1e9 (G/s)" << std::endl;
}
static void printTopkPairDataHeader() {
std::cout << std::setw(8) << "k值" << std::setw(15) << "升序(ms)" << std::setw(15) << "降序(ms)"
<< std::setw(16) << "升序(G/s)" << std::setw(16) << "降序(G/s)" << std::endl;
std::cout << std::string(74, '-') << std::endl;
}
// 显示性能数据行
static void printReduceSumData(int size, float time_ms, const PerformanceCalculator::ReduceSumMetrics& metrics) {
std::cout << std::setw(12) << size << std::setw(15) << std::fixed << std::setprecision(3)
<< time_ms << std::setw(20) << std::setprecision(3) << metrics.throughput_gps << std::endl;
}
static void printSortPairData(int size, float asc_time, float desc_time,
const PerformanceCalculator::SortPairMetrics& asc_metrics,
const PerformanceCalculator::SortPairMetrics& desc_metrics) {
std::cout << std::setw(12) << size << std::setw(15) << std::fixed << std::setprecision(3)
<< asc_time << std::setw(15) << desc_time << std::setw(16) << std::setprecision(3)
<< asc_metrics.throughput_gps << std::setw(16) << desc_metrics.throughput_gps << std::endl;
}
static void printTopkPairData(int k, float asc_time, float desc_time,
const PerformanceCalculator::TopkPairMetrics& asc_metrics,
const PerformanceCalculator::TopkPairMetrics& desc_metrics) {
std::cout << std::setw(8) << k << std::setw(15) << std::fixed << std::setprecision(3)
<< asc_time << std::setw(15) << desc_time << std::setw(16) << std::setprecision(3)
<< asc_metrics.throughput_gps << std::setw(16) << desc_metrics.throughput_gps << std::endl;
}
// 显示性能文件保存消息
static void printSavedMessage(const std::string& filename) {
std::cout << "\n性能结果已保存到: " << filename << std::endl;
}
};