Skip to content

Commit e1228ab

Browse files
Implement comprehensive PR-based results repository system
Major enhancement replacing gists with dedicated LinearSolveAutotuneResults.jl repository: **LinearSolveAutotuneResults.jl Repository:** - Complete Julia package for community benchmark analysis - Hardware-specific analysis functions (by CPU vendor, OS, BLAS, GPU) - Global plotting and comparison utilities - Comprehensive data loading and filtering capabilities **Enhanced Telemetry System:** - Creates PRs to SciML/LinearSolveAutotuneResults.jl automatically - Generates structured result folders with timestamp + system ID - Includes detailed system_info.csv with versioninfo() hardware data - Creates Project.toml with exact package versions used - Exports benchmark plots as PNG files - Comprehensive README.md with human-readable summary **Result Folder Structure:** ``` results/YYYY-MM-DD_HHMM_cpu-os/ ├── results.csv # Benchmark performance data ├── system_info.csv # Detailed hardware/software config ├── Project.toml # Package versions used ├── README.md # Human-readable summary └── benchmark_*.png # Performance plots per element type ``` **Analysis Capabilities:** - `analyze_hardware()` - Performance by CPU vendor, OS, BLAS, GPU - `filter_by_hardware()` - "get mean GFLOPs for all AMD machines" - `get_hardware_leaderboard()` - Top performing systems - `create_global_plots()` - Community-wide performance trends - `compare_systems()` - Direct system comparisons This creates a community-driven benchmark database enabling: - Hardware-specific algorithm recommendations - Performance optimization research - System configuration guidance - Global performance trend analysis 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent 3967830 commit e1228ab

File tree

3 files changed

+322
-44
lines changed

3 files changed

+322
-44
lines changed

lib/LinearSolveAutotune/src/LinearSolveAutotune.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ function autotune_setup(;
183183
if telemetry && nrow(successful_results) > 0
184184
@info "📤 Preparing telemetry data for community sharing..."
185185
markdown_content = format_results_for_github(results_df, system_info, categories)
186-
upload_to_github(markdown_content, plot_files, github_auth)
186+
upload_to_github(markdown_content, plot_files, github_auth, results_df, system_info, categories)
187187
end
188188

189189
@info "Autotune setup completed!"

lib/LinearSolveAutotune/src/gpu_detection.jl

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,100 @@ function get_system_info()
9898

9999
return info
100100
end
101+
102+
"""
103+
get_detailed_system_info()
104+
105+
Returns a comprehensive DataFrame with detailed system information suitable for CSV export.
106+
Includes versioninfo() details and hardware-specific information for analysis.
107+
"""
108+
function get_detailed_system_info()
109+
# Basic system information
110+
system_data = Dict{String, Any}()
111+
112+
# Julia and system basics
113+
system_data["timestamp"] = string(Dates.now())
114+
system_data["julia_version"] = string(VERSION)
115+
system_data["julia_commit"] = Base.GIT_VERSION_INFO.commit[1:10] # Short commit hash
116+
system_data["os_name"] = Sys.iswindows() ? "Windows" : Sys.islinux() ? "Linux" : Sys.isapple() ? "macOS" : "Other"
117+
system_data["os_version"] = string(Sys.KERNEL)
118+
system_data["architecture"] = string(Sys.ARCH)
119+
system_data["cpu_cores"] = Sys.CPU_THREADS
120+
system_data["julia_threads"] = Threads.nthreads()
121+
system_data["word_size"] = Sys.WORD_SIZE
122+
system_data["machine"] = Sys.MACHINE
123+
124+
# CPU details
125+
cpu_info = Sys.cpu_info()[1]
126+
system_data["cpu_name"] = cpu_info.model
127+
system_data["cpu_speed_mhz"] = cpu_info.speed
128+
129+
# Categorize CPU vendor for easy analysis
130+
cpu_name_lower = lowercase(system_data["cpu_name"])
131+
if contains(cpu_name_lower, "intel")
132+
system_data["cpu_vendor"] = "Intel"
133+
elseif contains(cpu_name_lower, "amd")
134+
system_data["cpu_vendor"] = "AMD"
135+
elseif contains(cpu_name_lower, "apple") || contains(cpu_name_lower, "m1") || contains(cpu_name_lower, "m2") || contains(cpu_name_lower, "m3")
136+
system_data["cpu_vendor"] = "Apple"
137+
else
138+
system_data["cpu_vendor"] = "Other"
139+
end
140+
141+
# BLAS and linear algebra libraries
142+
system_data["blas_vendor"] = string(LinearAlgebra.BLAS.vendor())
143+
system_data["lapack_vendor"] = string(LinearAlgebra.LAPACK.vendor())
144+
system_data["blas_num_threads"] = LinearAlgebra.BLAS.get_num_threads()
145+
146+
# LinearSolve-specific package availability
147+
system_data["mkl_available"] = LinearSolve.usemkl
148+
system_data["mkl_used"] = system_data["mkl_available"] && contains(lowercase(system_data["blas_vendor"]), "mkl")
149+
system_data["apple_accelerate_available"] = LinearSolve.appleaccelerate_isavailable()
150+
system_data["apple_accelerate_used"] = system_data["apple_accelerate_available"] && contains(lowercase(system_data["blas_vendor"]), "accelerate")
151+
152+
# GPU information
153+
system_data["cuda_available"] = is_cuda_available()
154+
system_data["metal_available"] = is_metal_available()
155+
156+
# Try to detect if CUDA/Metal packages are actually loaded
157+
system_data["cuda_loaded"] = false
158+
system_data["metal_loaded"] = false
159+
try
160+
# Check if CUDA algorithms are actually available
161+
if system_data["cuda_available"]
162+
system_data["cuda_loaded"] = isdefined(Main, :CUDA) || haskey(Base.loaded_modules, Base.PkgId(Base.UUID("052768ef-5323-5732-b1bb-66c8b64840ba"), "CUDA"))
163+
end
164+
if system_data["metal_available"]
165+
system_data["metal_loaded"] = isdefined(Main, :Metal) || haskey(Base.loaded_modules, Base.PkgId(Base.UUID("dde4c033-4e86-420c-a63e-0dd931031962"), "Metal"))
166+
end
167+
catch
168+
# If we can't detect, leave as false
169+
end
170+
171+
# Environment information
172+
system_data["libm"] = Base.libm_name
173+
system_data["libdl"] = Base.libdl_name
174+
175+
# Memory information (if available)
176+
try
177+
if Sys.islinux()
178+
meminfo = read(`cat /proc/meminfo`, String)
179+
mem_match = match(r"MemTotal:\s*(\d+)\s*kB", meminfo)
180+
if mem_match !== nothing
181+
system_data["total_memory_gb"] = round(parse(Int, mem_match.captures[1]) / 1024 / 1024, digits=2)
182+
else
183+
system_data["total_memory_gb"] = missing
184+
end
185+
elseif Sys.isapple()
186+
mem_bytes = parse(Int, read(`sysctl -n hw.memsize`, String))
187+
system_data["total_memory_gb"] = round(mem_bytes / 1024^3, digits=2)
188+
else
189+
system_data["total_memory_gb"] = missing
190+
end
191+
catch
192+
system_data["total_memory_gb"] = missing
193+
end
194+
195+
# Create DataFrame with single row
196+
return DataFrame([system_data])
197+
end

0 commit comments

Comments
 (0)