mirror of
https://github.com/luxfi/dex.git
synced 2026-09-24 00:26:31 +00:00
247 lines
9.0 KiB
Go
247 lines
9.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// MLX Order structure optimized for GPU
|
|
type MLXOrder struct {
|
|
ID uint32 // 4 bytes
|
|
Price float32 // 4 bytes
|
|
Size float32 // 4 bytes
|
|
Side uint8 // 1 byte
|
|
Type uint8 // 1 byte
|
|
Flags uint16 // 2 bytes
|
|
Time uint32 // 4 bytes (offset from epoch)
|
|
} // Total: 20 bytes
|
|
|
|
// MLX Market structure
|
|
type MLXMarket struct {
|
|
BidBuffer []MLXOrder // GPU buffer for bids
|
|
AskBuffer []MLXOrder // GPU buffer for asks
|
|
TradeBuffer []MLXOrder // GPU buffer for trades
|
|
MarketID uint32
|
|
LastTradeTime uint32
|
|
}
|
|
|
|
func main() {
|
|
fmt.Println("=== MLX Unified Memory Analysis for DEX ===")
|
|
fmt.Println("Note: On Apple Silicon, CPU and GPU share the same memory pool")
|
|
fmt.Println()
|
|
|
|
// Calculate memory for different market scales
|
|
marketScales := []int{100, 1000, 10000, 100000, 1000000}
|
|
ordersPerMarket := 50 // Average active orders per market
|
|
|
|
fmt.Println("Memory Requirements (MLX Unified Memory Architecture):")
|
|
fmt.Println("=" + string(make([]byte, 70)))
|
|
fmt.Printf("%-15s %-15s %-15s %-15s %-15s\n",
|
|
"Markets", "Order Memory", "GPU Buffers", "Total Memory", "Hardware Req")
|
|
fmt.Println("-" + string(make([]byte, 70)))
|
|
|
|
for _, numMarkets := range marketScales {
|
|
// Calculate memory components
|
|
orderSize := 20 // MLX optimized order struct
|
|
|
|
// Order book memory (bids + asks)
|
|
orderMemory := int64(numMarkets) * int64(ordersPerMarket) * int64(orderSize) * 2
|
|
|
|
// GPU processing buffers (for batch operations)
|
|
// We allocate 20% of order memory for GPU working buffers
|
|
gpuBuffers := orderMemory / 5
|
|
|
|
// Market metadata and indices
|
|
metadataMemory := int64(numMarkets) * 256 // 256 bytes per market metadata
|
|
|
|
// Trade history (last 100 trades per market)
|
|
tradeMemory := int64(numMarkets) * 100 * int64(orderSize)
|
|
|
|
// Total memory
|
|
totalMemory := orderMemory + gpuBuffers + metadataMemory + tradeMemory
|
|
|
|
// Format output
|
|
fmt.Printf("%-15s %-15s %-15s %-15s %-15s\n",
|
|
formatNumber(numMarkets),
|
|
formatBytes(orderMemory),
|
|
formatBytes(gpuBuffers),
|
|
formatBytes(totalMemory),
|
|
getHardwareRecommendation(totalMemory))
|
|
}
|
|
|
|
fmt.Println()
|
|
fmt.Println("=== Detailed Breakdown for Each Scale ===")
|
|
fmt.Println()
|
|
|
|
for _, numMarkets := range marketScales {
|
|
analyzeMarketScale(numMarkets, ordersPerMarket)
|
|
}
|
|
|
|
// MLX-specific optimizations
|
|
fmt.Println("=== MLX GPU Acceleration Benefits ===")
|
|
fmt.Println()
|
|
fmt.Println("1. Zero-Copy Architecture:")
|
|
fmt.Println(" - No CPU→GPU memory transfers needed")
|
|
fmt.Println(" - Direct GPU access to all order books")
|
|
fmt.Println(" - Instant kernel launches")
|
|
fmt.Println()
|
|
fmt.Println("2. Parallel Processing:")
|
|
fmt.Println(" - Match all markets simultaneously")
|
|
fmt.Println(" - Batch operations across markets")
|
|
fmt.Println(" - Hardware-accelerated sorting")
|
|
fmt.Println()
|
|
fmt.Println("3. Memory Efficiency:")
|
|
fmt.Println(" - Shared memory pool (no duplication)")
|
|
fmt.Println(" - Dynamic allocation as needed")
|
|
fmt.Println(" - Automatic memory compression")
|
|
}
|
|
|
|
func analyzeMarketScale(numMarkets, ordersPerMarket int) {
|
|
fmt.Printf("--- %s Markets Analysis ---\n", formatNumber(numMarkets))
|
|
|
|
orderSize := 20 // bytes
|
|
|
|
// Calculate components
|
|
orderMemory := int64(numMarkets) * int64(ordersPerMarket) * int64(orderSize) * 2
|
|
gpuBuffers := orderMemory / 5
|
|
metadataMemory := int64(numMarkets) * 256
|
|
tradeMemory := int64(numMarkets) * 100 * int64(orderSize)
|
|
indexMemory := int64(numMarkets) * 64 // Hash indices
|
|
|
|
totalMemory := orderMemory + gpuBuffers + metadataMemory + tradeMemory + indexMemory
|
|
|
|
fmt.Printf(" Order Books (CPU/GPU shared): %s\n", formatBytes(orderMemory))
|
|
fmt.Printf(" GPU Processing Buffers: %s\n", formatBytes(gpuBuffers))
|
|
fmt.Printf(" Market Metadata: %s\n", formatBytes(metadataMemory))
|
|
fmt.Printf(" Trade History: %s\n", formatBytes(tradeMemory))
|
|
fmt.Printf(" Indices & Caches: %s\n", formatBytes(indexMemory))
|
|
fmt.Printf(" --------------------------------\n")
|
|
fmt.Printf(" Total System + GPU Memory: %s\n", formatBytes(totalMemory))
|
|
|
|
// Performance metrics
|
|
matchingRate := numMarkets * 1000 // orders/sec per market
|
|
fmt.Printf(" \n")
|
|
fmt.Printf(" Expected Performance:\n")
|
|
fmt.Printf(" - Matching throughput: %s orders/sec\n", formatNumber(matchingRate))
|
|
fmt.Printf(" - Latency: <100μs batch processing\n")
|
|
fmt.Printf(" - Power usage: ~%.0fW\n", estimatePower(totalMemory))
|
|
|
|
// Hardware recommendation
|
|
fmt.Printf(" \n")
|
|
fmt.Printf(" Recommended Hardware:\n")
|
|
fmt.Printf(" %s\n", getDetailedHardwareRec(totalMemory))
|
|
fmt.Println()
|
|
}
|
|
|
|
func formatBytes(bytes int64) string {
|
|
if bytes < 1024 {
|
|
return fmt.Sprintf("%d B", bytes)
|
|
} else if bytes < 1024*1024 {
|
|
return fmt.Sprintf("%.2f KB", float64(bytes)/1024)
|
|
} else if bytes < 1024*1024*1024 {
|
|
return fmt.Sprintf("%.2f MB", float64(bytes)/(1024*1024))
|
|
} else if bytes < 1024*1024*1024*1024 {
|
|
return fmt.Sprintf("%.2f GB", float64(bytes)/(1024*1024*1024))
|
|
} else {
|
|
return fmt.Sprintf("%.2f TB", float64(bytes)/(1024*1024*1024*1024))
|
|
}
|
|
}
|
|
|
|
func formatNumber(n int) string {
|
|
if n < 1000 {
|
|
return fmt.Sprintf("%d", n)
|
|
} else if n < 1000000 {
|
|
return fmt.Sprintf("%dK", n/1000)
|
|
} else {
|
|
return fmt.Sprintf("%.1fM", float64(n)/1000000)
|
|
}
|
|
}
|
|
|
|
func getHardwareRecommendation(memoryBytes int64) string {
|
|
memoryGB := float64(memoryBytes) / (1024 * 1024 * 1024)
|
|
|
|
switch {
|
|
case memoryGB < 8:
|
|
return "Mac mini M2"
|
|
case memoryGB < 32:
|
|
return "Mac mini M2 Pro"
|
|
case memoryGB < 96:
|
|
return "Mac Studio M2 Max"
|
|
case memoryGB < 192:
|
|
return "Mac Studio M2 Ultra"
|
|
case memoryGB < 384:
|
|
return "2x Mac Studio M2 Ultra"
|
|
default:
|
|
return "Distributed cluster"
|
|
}
|
|
}
|
|
|
|
func getDetailedHardwareRec(memoryBytes int64) string {
|
|
memoryGB := float64(memoryBytes) / (1024 * 1024 * 1024)
|
|
|
|
switch {
|
|
case memoryGB < 8:
|
|
return "• Mac mini M2 (8-24GB) - Entry level, development"
|
|
case memoryGB < 32:
|
|
return "• Mac mini M2 Pro (32GB) - Small exchange, <10K markets"
|
|
case memoryGB < 64:
|
|
return "• Mac Studio M2 Max (64GB) - Medium exchange, <50K markets"
|
|
case memoryGB < 96:
|
|
return "• Mac Studio M2 Max (96GB) - Large exchange, <100K markets"
|
|
case memoryGB < 192:
|
|
return "• Mac Studio M2 Ultra (192GB) - Global exchange, 1M markets"
|
|
case memoryGB < 384:
|
|
return "• 2x Mac Studio M2 Ultra networked - 2M+ markets"
|
|
default:
|
|
return "• Distributed cluster with 10+ nodes"
|
|
}
|
|
}
|
|
|
|
func estimatePower(memoryBytes int64) float64 {
|
|
memoryGB := float64(memoryBytes) / (1024 * 1024 * 1024)
|
|
|
|
// Rough power estimates based on memory usage
|
|
switch {
|
|
case memoryGB < 32:
|
|
return 50 // Mac mini M2 Pro
|
|
case memoryGB < 96:
|
|
return 100 // Mac Studio M2 Max
|
|
case memoryGB < 192:
|
|
return 200 // Mac Studio M2 Ultra (actual max 370W)
|
|
default:
|
|
return 400 // Multiple machines
|
|
}
|
|
}
|
|
|
|
func showMemoryLayout() {
|
|
fmt.Println("=== Memory Layout in MLX Architecture ===")
|
|
fmt.Println()
|
|
fmt.Println("┌─────────────────────────────────────┐")
|
|
fmt.Println("│ Unified Memory (CPU+GPU) │")
|
|
fmt.Println("├─────────────────────────────────────┤")
|
|
fmt.Println("│ Order Books (Direct GPU Access) │")
|
|
fmt.Println("│ ┌─────────────────────────────┐ │")
|
|
fmt.Println("│ │ Market 1: Bids | Asks │ │")
|
|
fmt.Println("│ │ Market 2: Bids | Asks │ │")
|
|
fmt.Println("│ │ ... │ │")
|
|
fmt.Println("│ │ Market N: Bids | Asks │ │")
|
|
fmt.Println("│ └─────────────────────────────┘ │")
|
|
fmt.Println("│ │")
|
|
fmt.Println("│ GPU Processing Buffers │")
|
|
fmt.Println("│ ┌─────────────────────────────┐ │")
|
|
fmt.Println("│ │ Batch Match Results │ │")
|
|
fmt.Println("│ │ Sorting Workspace │ │")
|
|
fmt.Println("│ │ Aggregation Buffers │ │")
|
|
fmt.Println("│ └─────────────────────────────┘ │")
|
|
fmt.Println("│ │")
|
|
fmt.Println("│ Trade History & Metadata │")
|
|
fmt.Println("│ ┌─────────────────────────────┐ │")
|
|
fmt.Println("│ │ Recent Trades │ │")
|
|
fmt.Println("│ │ Market Statistics │ │")
|
|
fmt.Println("│ │ User Positions │ │")
|
|
fmt.Println("│ └─────────────────────────────┘ │")
|
|
fmt.Println("└─────────────────────────────────────┘")
|
|
fmt.Println()
|
|
fmt.Println("Note: Zero-copy between CPU and GPU cores")
|
|
fmt.Println(" All data instantly accessible by both")
|
|
}
|