Όλες οι εικόνες που δημιουργήθηκαν από τον συγγραφέα δωρεάν με το NightCafe Studio - δείτε το υπόβαθρο για τον σύνδεσμο.
Όλες οι εικόνες που δημιουργήθηκαν από τον συγγραφέα δωρεάν με το NightCafe Studio - δείτε το υπόβαθρο για τον σύνδεσμο.
Όλες οι εικόνες που δημιουργήθηκαν από τον συγγραφέα δωρεάν με το NightCafe Studio - δείτε το υπόβαθρο για τον σύνδεσμο.Η εποχή των υπολογιστών υψηλών επιδόσεων ορίζεται από ένα όνομα:Το θαύμα.
Το θαύμα.Η πλατφόρμα της NVIDIA απέκλεισε την ισχύ των GPU, καθιστώντας το de facto πρότυπο.
Για πάνω από μια δεκαετία, το να προγραμματίζεις μια GPU σήμαινε να προγραμματίζεις σε CUDA.
Αυτή η κυριαρχία, ωστόσο, δημιούργησε ένα κλουβί, κλείνοντας την πρόοδο σε έναν μόνο προμηθευτή.
Αυτή η κυριαρχία, ωστόσο, δημιούργησε ένα κλουβί, κλείνοντας την πρόοδο σε έναν μόνο προμηθευτή.
Αυτή η κυριαρχία, ωστόσο, δημιούργησε ένα κλουβί, κλείνοντας την πρόοδο σε έναν μόνο προμηθευτή.Αλλά σήμερα, στα μέσα του 2025 - τα πράγματα αλλάζουν.
Αλλά σήμερα, στα μέσα του 2025 - τα πράγματα αλλάζουν.
The computing world is now undergoing a radical transformation towards heterogeneity.
Βλέπουμε την εξάπλωση του εξειδικευμένου υλικού:
-
Intel Gaudi Series:
Intel's Gaudi processors are designed specifically for deep learning training and inference, offering a competitive alternative to Nvidia's GPUs.
-
AMD Instinct MI Series:
AMD's MI series of GPUs is designed for high-performance computing and AI workloads, providing an alternative to Nvidia's data center GPUs.
-
Groq Tensor Streaming Processor (TSP):
Groq's TSP architecture is designed for low-latency inference and high throughput, particularly for large language models.
-
Google TPUs (Tensor Processing Units):
Google's TPUs are custom-designed chips optimized for machine learning workloads, particularly in Google's cloud infrastructure.
-
AWS Trainium:
AWS Trainium is a chip designed for machine learning training, offering high performance and cost-effectiveness.
Και όλο και περισσότερες νεοσύστατες εταιρείες που κατασκευάζουν προσαρμοσμένες μάρκες πυριτίου εμφανίζονται κάθε μέρα.
Και όλο και περισσότερες νεοσύστατες εταιρείες που κατασκευάζουν προσαρμοσμένες μάρκες πυριτίου εμφανίζονται κάθε μέρα.Αυτό το νέο, ποικίλο τοπίο απαιτεί μια νέα φιλοσοφία προγραμματισμού.
Η πολυεπίπεδη ενδιάμεση εκπροσώπηση (MLIR) και η γλώσσα προγραμματισμού Mojo
This is not just another competitor; they represent a fundamental paradigm shift.
Πρόκειται για μια επανάσταση στον τρόπο που σχεδιάζουμε, βελτιστοποιούμε και αναπτύσσουμε λογισμικό για οποιοδήποτε υλικό.
This is a revolution in how we design, optimize, and deploy software for any hardware.
This article will deeply explore the architectural chasm between CUDA and MLIR.
- Θα χρησιμοποιήσουμε πλήρη, παραδείγματα κώδικα εργασίας για να παρέχουμε μια συγκεκριμένη, πρακτική σύγκριση.
- Θα διακρίνουμε γιατί το MLIR είναι μια ανακάλυψη έναντι του αξιότιμου προκατόχου του, LLVM.
- Θα υποστηρίξουμε ότι το Mojo είναι η ανώτερη μακροπρόθεσμη λύση.
- Θα αναλύσουμε γιατί αυτή η νέα στοίβα είναι μια αλλαγή παιχνιδιού για το κόστος και την ταχύτητα.
Αυτή η επίδραση επεκτείνεται σε κρίσιμους αναδυόμενους τομείς όπωςGenerative AI, Quantum ComputingΚαι ακόμη καιBlockchain.
Θα εξετάσουμε επίσης το μέλλον, καλύπτονταςmining ASICs,Neuromorphic Computingκαιspecialized hardwareγια σπάνιες ροές δεδομένων που οι GPU χειρίζονται άσχημα.
Είναι το τέλος μιας εποχής και η αυγή μιας νέας.
Είναι το τέλος μιας εποχής και η αυγή μιας νέας.
Για να κατανοήσουμε το μέγεθος αυτής της αλλαγής, πρέπει πρώτα ναunderstand the four key players.
1. CUDA: The Powerful, Proprietary Incumbent
CUDA: Ο ισχυρός, ιδιοκτήτης υπάλληλοςCUDA stands for Compute Unified Device Architecture.
Είναι η πλατφόρμα παράλληλης πληροφορικής και το μοντέλο προγραμματισμού της NVIDIA.
Επιτρέπει στους προγραμματιστές να γράφουν κώδικα παρόμοιο με το C++, που ονομάζεται πυρήνες, που εκτελούνται σε GPUs της NVIDIA.
CUDA's Strengths:
Οι δυνάμεις της κουζίνας:Its ecosystem of libraries is mature and unmatched:
- Mathematical Libraries:
- cuBLAS: For basic linear algebra subprograms (BLAS).
- cuRAND: For random number generation.
- cuFFT: For Fast Fourier Transforms.
- cuSPARSE: For sparse matrix operations.
- cuTENSOR: For tensor operations.
- cuSOLVER: For dense and sparse direct solvers.
- Parallel Algorithm Libraries:
- nvGRAPH: For graph algorithms.
- Thrust: For parallel algorithms and data structures.
- Communication Libraries:
- NVSHMEM: For partitioned global address space (PGAS) programming.
- NCCL: For multi-GPU and multi-node collective communication.
- Deep Learning Libraries:
- cuDNN: For deep neural network computations.
- TensorRT: For optimized deep learning inference.
- Riva: For conversational AI.
- DALI: For data loading and augmentation for deep learning.
Παρέχει άμεσο, χαμηλού επιπέδου έλεγχο του υλικού, επιτρέποντας κορυφαίες επιδόσεις για τους ειδικούς.
Η μακρά ιστορία της έχει χτίσει μια τεράστια κοινότητα με τεράστια τεκμηρίωση και υποστήριξη.
Its long history has built a massive community with vast documentation and support.
CUDA's Fatal Flaw: The Cage
Vendor Lock-In: CUDA code runs only on NVIDIA GPUs.
ΜόνοΑυτό συνδέει τους προγραμματιστές και ολόκληρες βιομηχανίες σε έναν ενιαίο, ακριβό προμηθευτή υλικού.
Καταπνίγει τον ανταγωνισμό και περιορίζει την ελευθερία επιλογής του καλύτερου υλικού για την εργασία.
Το πρόβλημα των δύο γλωσσών: ένα σημαντικό κενό στην τεχνητή νοημοσύνη και τον επιστημονικό υπολογισμό.
Οι ερευνητές πρωτότυπο σε μια γλώσσα υψηλού επιπέδου όπως η Python για την απλότητα και την ταχύτητα της επανάληψης.
Αλλά για την παραγωγή, ο κώδικας κρίσιμης απόδοσης πρέπει να ξαναγραφεί εντελώς σε χαμηλό επίπεδο C++/CUDA.
But for production, performance-critical code must be completely rewritten in low-level C++/CUDA.
Αυτό δημιουργεί μια επώδυνη και δαπανηρή αποσύνδεση, επιβραδύνοντας την πορεία από την έρευνα στην ανάπτυξη.
Η πολυπλοκότητα του προγραμματισμού:
Το CUDA είναι ισχυρό, αλλά διαβόητα περίπλοκο και λεκτικό.
Ο προγραμματιστής είναι υποχρεωμένος να
ένα χειροκίνητο διαχειριστή μνήμης, μεταφέροντας δεδομένα μεταξύ της CPU (οικονόμος) και της GPU (συσκευή).
Ο προγραμματιστής πρέπει επίσης να είναι προγραμματιστής υλικού, διαχειρίζοντας μπλοκ νήματος, δίκτυα και συγχρονισμό.
Αυτή η πολυπλοκότητα είναι μια απότομη καμπύλη μάθησης και μια συχνή πηγή λεπτών σφαλμάτων.
2. LLVM: The Foundation and Its "Semantic Gap”
LLVM: Το Ίδρυμα και το «Σημαντικό χάσμα» τουΤο έργο LLVM είναι μια συλλογή από τεχνολογίες μεταγλωττιστών αρθρωτών και επαναχρησιμοποιήσιμων.
Ο πυρήνας του είναι η LLVM Intermediate Representation (IR), μια γλώσσα χαμηλού επιπέδου, που μοιάζει με συναρμολόγηση.
Το LLVM έγινε το πρότυπο για τα σύγχρονα backend compiler, ειδικά για CPU.
Ένα compiler frontend (όπως το Clang για C++) μεταφράζει τον πηγαίο κώδικα σε LLVM IR.
Το backend LLVM στη συνέχεια βελτιστοποιεί αυτό το IR και το μετατρέπει σε κώδικα μηχανής για μια συγκεκριμένη CPU.
Αυτή η μοντελοποίηση ήταν επαναστατική για την εποχή της.
Ωστόσο, το LLVM σχεδιάστηκε για έναν κόσμο με επίκεντρο την CPU.
Το IR του είναι πολύ χαμηλό για τον νέο κόσμο του ετερογενούς υλικού.
Χάνει κρίσιμες πληροφορίες υψηλού επιπέδου από τον πηγαίο κώδικα, ένα πρόβλημα γνωστό ως το «σημαντικό κενό».
Για παράδειγμα, κατά τη σύνταξη ενός μοντέλου TensorFlow, η γνώση ότι μια λειτουργία είναι μια Convolution χάνεται.
Το LLVM IR βλέπει μόνο μια γενική συλλογή κυψελών και αριθμητικών οδηγιών.
Αυτό εμποδίζει τον μεταγλωττιστή από την εκτέλεση ισχυρών, ειδικών για τομέα βελτιστοποιήσεων.
Δεν καταλαβαίνει πλέον την υψηλή πρόθεση του προγραμματιστή.
Αυτή είναι η ουσία του «προβλήματος του σημασιολογικού χάσματος».
Και αυτό είναι το πρόβλημα που έχει λύσει η MLIR.
It loses crucial high-level information from the source code, a problem known as the "semantic gap."
For example, when compiling a TensorFlow model, the knowledge that an operation is a Convolution is lost.
LLVM IR only sees a generic collection of loops and arithmetic instructions.
This prevents the compiler from performing powerful, domain-specific optimizations.
It no longer understands the programmer's high-level intent.
This is the essence of the “semantic gap problem.”
And this problem is what MLIR has Solved.
3. MLIR: The Universal Translator for Hardware
MLIR: Ο καθολικός μεταφραστής για το υλικόΗ MLIR γεννήθηκε στην Google από την ανάγκη να συντάξει το TensorFlow για CPU, GPU και TPU.
Συνειδητοποίησαν ότι η ενιαία, χαμηλού επιπέδου IR του LLVM δεν ήταν αρκετή.
Η ανακάλυψη του MLIR είναι μια ενοποιημένη υποδομή για τον ορισμό και τη σύνθεση πολλαπλών IRs.
Αυτά τα σύνθετα IRs ονομάζονται διαλέκτους.
ΔιαλέκτουςΤο MLIR είναι σαν ένας καθολικός μεταφραστής, ευέλικτος σε όλα, από έννοιες υψηλού επιπέδου έως λεπτομέρειες μηχανής χαμηλού επιπέδου.
Μια διάλεκτος υψηλού επιπέδου μπορεί να αντιπροσωπεύει άμεσα συγκεκριμένες έννοιες τομέα.
For example, a "TensorFlow dialect" has an operation for tf.conv2d.
A "Linear Algebra dialect" has an operation for linalg.matmul.
Αυτό διατηρεί τις κρίσιμες σημασιολογικές πληροφορίες που απορρίπτει το LLVM.
Αυτό επιτρέπει μια ισχυρή στρατηγική compiler που ονομάζεταιΠροοδευτική μείωση* * * *
Προοδευτική μείωση
- Ο μεταγλωττιστής ξεκινά με μια εκπροσώπηση διαλέκτου υψηλού επιπέδου.
- Εκτελεί υψηλού επιπέδου, ειδικές βελτιστοποιήσεις τομέα σε αυτή τη διάλεκτο.
- Στη συνέχεια, σταδιακά «κατεβάζει» τον κώδικα μέσω μιας σειράς ενδιάμεσων διαλέκτων.
- Κάθε ενδιάμεση διάλεκτος εκτελεί τη δική του ειδική βελτιστοποίηση.
- Τέλος, φτάνει σε μια διάλεκτο χαμηλού επιπέδου, όπως η διάλεκτος LLVM IR, για την τελική παραγωγή κώδικα μηχανής.
This process preserves high-level context for as long as possible.
This enables vastly superior optimizations for any hardware target.
Το MLIR είναι η έλλειψη σύνδεσης μεταξύ γλωσσών υψηλού επιπέδου και ποικίλης σιλικόνης.
Το MLIR είναι η έλλειψη σύνδεσης μεταξύ γλωσσών υψηλού επιπέδου και ποικίλης σιλικόνης.
Το MLIR είναι η έλλειψη σύνδεσης μεταξύ γλωσσών υψηλού επιπέδου και ποικίλης σιλικόνης.4. Mojo: The User-Friendly Face of MLIR's Power
Mojo: Το φιλικό προς το χρήστη πρόσωπο της δύναμης του MLIRΕάν το MLIR είναι η ισχυρή, πολύπλοκη μηχανή, το Mojo είναι η κομψή, διαισθητική διεπαφή χρήστη.
Το Mojo δημιουργήθηκε από τον Chris Lattner, τον αρχικό αρχιτέκτονα του LLVM και της γλώσσας Swift.
Το Mojo δημιουργήθηκε από τον Chris Lattner, τον αρχικό αρχιτέκτονα του LLVM και της γλώσσας Swift.
Έχει σχεδιαστεί από τις πρώτες αρχές για να είναι η τέλεια γλώσσα για την εποχή MLIR.
Από αυτή την άποψη, είναι η πιο τεχνολογικά προηγμένη γλώσσα σήμερα.
Even Rust is based on LLVM and has all of LLVM’s shortcomings.
Even Rust is based on LLVM and has all of LLVM’s shortcomings.
Το Mojo είναι η μόνη σημαντική γλώσσα προγραμματισμού που βασίζεται στο MLIR.
Mojo is the only major programming language today based on MLIR.
Mojo's Key Features:
Ένα υπερσύνολο Python
- Το Mojo στοχεύει στην πλήρη συμβατότητα με το υπάρχον οικοσύστημα Python.
- This is a killer feature!
- Επιτρέπει στους προγραμματιστές να εισάγουν και να χρησιμοποιούν οποιαδήποτε βιβλιοθήκη Python όπως NumPy, Pandas ή Matplotlib.
- It completely bypasses the "cold start" problem that new languages face by tapping into Python's vast ecosystem.
Βασικά χαρακτηριστικά προγραμματισμού συστημάτων:
- Σε αντίθεση με την Python, το Mojo είναι μια σύνθετη γλώσσα με ισχυρή στατική πληκτρολόγηση.
- This eliminates entire classes of runtime errors and enables C++-level performance optimizations.
- Εισάγει σύγχρονες έννοιες διαχείρισης μνήμης όπως η ιδιοκτησία και η δανεισμός (από το Rust) για την ασφάλεια της μνήμης χωρίς την επάνω κεφαλή ενός συλλέκτη απορριμμάτων.
Πρώτης κατηγορίας ενοποίηση MLIR:
- Το Mojo εκθέτει την πλήρη ισχύ του MLIR απευθείας στον προγραμματιστή.
- Programmers can write high-level, Pythonic code for most of their application.
- Όταν απαιτείται μέγιστη απόδοση, μπορούν να χρησιμοποιήσουν συγκεκριμένες διαλέκτους MLIR και να γράψουν πυρήνες χαμηλού επιπέδου.
- Βασικά, όλα αυτά μπορούν να γίνουν μέσα στο ίδιο αρχείο, στην ίδια γλώσσα.
Το Mojo λύνει κομψά το «δύο-γλωσσικό πρόβλημα».
Mojo elegantly solves the "two-language problem."
Full Code Examples and Analysis
Πλήρες κώδικα παραδείγματα και ανάλυσηΗ θεωρία είναι ένα πράγμα, η πρακτική είναι άλλο.
Τα παρακάτω πλήρη, παραδείγματα κώδικα εργασίας -
Θα δείξει τις βαθιές διαφορές μεταξύ των δύο παραδειγμάτων.
Example 1: Matrix Multiplication
Example 1: Matrix MultiplicationΑυτό είναι το "Hello, World!" της υπολογιστικής υψηλών επιδόσεων και αποκαλύπτει σαφώς τη βασική φιλοσοφία κάθε πλατφόρμας.
The Full CUDA Implementation
Πρόκειται για ένα ολοκληρωμένο πρόγραμμα CUDA για τον πολλαπλασιασμό μήκους.
(Από το C++)
// Filename: matmul.cu
// To compile: nvcc matmul.cu -o matmul_cuda
#include <iostream>
#include <vector>
#include <cuda_runtime.h>
// Helper to check for CUDA errors
#define CUDA_CHECK(err) { \
cudaError_t err_code = err; \
if (err_code != cudaSuccess) { \
std::cerr << "CUDA Error: " << cudaGetErrorString(err_code) << " at line " << __LINE__ << std::endl; \
exit(EXIT_FAILURE); \
} \
}
// CUDA Kernel for Matrix Multiplication (Device Code)
__global__ void matrixMulKernel(float* C, const float* A, const float* B, int N) {
// Calculate the global row and column index of the element
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
// Boundary check to avoid accessing out-of-bounds memory
if (row < N && col < N) {
float p_value = 0.0f;
// Each thread computes one element of the result matrix C
for (int k = 0; k < N; ++k) {
p_value += A[row * N + k] * B[k * N + col];
}
C[row * N + col] = p_value;
}
}
// Main function (Host Code)
int main() {
const int N = 256;
const int size = N * N * sizeof(float);
// Step 1. Allocate host memory
std::vector<float> h_A(N * N);
std::vector<float> h_B(N * N);
std::vector<float> h_C(N * N);
// Initialize host matrices
for (int i = 0; i < N * N; ++i) {
h_A[i] = static_cast<float>(rand()) / RAND_MAX;
h_B[i] = static_cast<float>(rand()) / RAND_MAX;
}
// Step 2. Allocate device memory
float *d_A, *d_B, *d_C;
CUDA_CHECK(cudaMalloc((void**)&d_A, size));
CUDA_CHECK(cudaMalloc((void**)&d_B, size));
CUDA_CHECK(cudaMalloc((void**)&d_C, size));
// Step 3. Copy matrices from host to device
std::cout << "Copying data from host to device..." << std::endl;
CUDA_CHECK(cudaMemcpy(d_A, h_A.data(), size, cudaMemcpyHostToDevice));
CUDA_CHECK(cudaMemcpy(d_B, h_B.data(), size, cudaMemcpyHostToDevice));
// Step 4. Define kernel launch configuration
// Use 16x16 threads per block, a common choice
dim3 threadsPerBlock(16, 16);
// Calculate the number of blocks needed in each dimension
dim3 numBlocks((N + threadsPerBlock.x - 1) / threadsPerBlock.x, (N + threadsPerBlock.y - 1) / threadsPerBlock.y);
// Step 5. Launch the kernel on the device
std::cout << "Launching kernel..." << std::endl;
matrixMulKernel<<<numBlocks, threadsPerBlock>>>(d_C, d_A, d_B, N);
CUDA_CHECK(cudaGetLastError());
CUDA_CHECK(cudaDeviceSynchronize()); // Wait for the kernel to finish
// Step 6. Copy the result matrix back from device to host
std::cout << "Copying result from device to host..." << std::endl;
CUDA_CHECK(cudaMemcpy(h_C.data(), d_C, size, cudaMemcpyDeviceToHost));
// Step 7. Free device memory
CUDA_CHECK(cudaFree(d_A));
CUDA_CHECK(cudaFree(d_B));
CUDA_CHECK(cudaFree(d_C));
std::cout << "CUDA Matrix Multiplication finished successfully." << std::endl;
// (Optional: Add verification step here)
return 0;
}
Analysis of the CUDA Code:
Ανάλυση του κώδικα CUDA:The code is dominated by boilerplate and low-level management.
Steps 1, 2, 3, 6, and 7 are purely for managing memory across the CPU/GPU boundary.
Αυτό είναι βαρετό, επιρρεπές σε λάθη και αποκρύπτει τον βασικό αλγόριθμο.
Η
This code is fundamentally and permanently tied to NVIDIA's hardware architecture.
The actual algorithm—three nested loops—is a tiny fraction of the total code.
Η διανοητική επιβάρυνση του προγραμματιστή δαπανάται για τη διαχείριση του υλικού, όχι για το ίδιο το πρόβλημα.
The programmer's mental overhead is spent on hardware management, not on the problem itself.
The Full Mojo Implementation
Ολόκληρη η εφαρμογή του MojoThis Mojo version achieves the same result with breathtaking simplicity and power.
(Mojo)
# Filename: matmul.mojo
# To run: mojo matmul.mojo
from memory import DType, Tensor
from random import rand
from time import now
fn matmul_naive(C: Tensor[DType.float32], A: Tensor[DType.float32], B: Tensor[DType.float32]):
"""A naive, high-level implementation of matrix multiplication."""
let N = A.dim(0)
let M = A.dim(1)
let P = B.dim(1)
for i in range(N):
for j in range(P):
var sum: Float32 = 0.0
for k in range(M):
sum += A.load(i, k) * B.load(k, j)
C.store(i, j, sum)
fn main():
let N = 256
# 1. Allocate and initialize tensors.
# Mojo's Tensor handles memory allocation automatically.
# The compiler will place it in the most appropriate memory space.
var A = Tensor[DType.float32](N, N)
var B = Tensor[DType.float32](N, N)
var C = Tensor[DType.float32](N, N)
for i in range(N):
for j in range(N):
A.store(i, j, rand[DType.float32]())
B.store(i, j, rand[DType.float32]())
print("Starting Mojo Matrix Multiplication...")
let start_time = now()
# 2. Call the function.
# The MLIR-based compiler optimizes this high-level code.
# It can automatically tile, vectorize, and parallelize this code
# for the target hardware (CPU, GPU, etc.).
matmul_naive(C, A, B)
let end_time = now()
let duration_ms = (end_time - start_time) / 1_000_000.0
print("Mojo Matrix Multiplication finished successfully.")
print("Execution time:", duration_ms, "ms")
# (Optional: Print a corner of the result matrix to verify)
print("Result C[0,0]:", C.load(0,0))
}
Και αυτό είναι όλο!
The Mojo Approach is Far Superior
Η προσέγγιση του Mojo είναι πολύ ανώτερηΠρογραμματισμός και εστίαση:
- Ο κώδικας Mojo είναι καθαρός και εκφράζει τον αλγόριθμο άμεσα.
- The programmer focuses on the what (the math), not the how (the memory transfers).
- There is no manual cudaMalloc, cudaMemcpy, or cudaFree.
- Όλη αυτή η κατηγορία σφαλμάτων έχει εξαφανιστεί.
Abstraction with Performance:
- Οι απλοί αγκυροβολημένοι κύκλοι δεν είναι αυτό που εκτελείται.
- Ο μεταγλωττιστής που βασίζεται στο MLIR εκτελεί εξελιγμένους μετασχηματισμούς.
- That turns this simple code into a highly-optimized kernel.
- Μπορεί να εφαρμόσει αυτόματα το πλακίδιο, το βέκτορα και το παράλληλο.
- Ο προγραμματιστής μπορεί να προσθέσει συμβουλές (όπως @vectorize ή @parallelize) για να καθοδηγήσει τον μεταγλωττιστή, επιτυγχάνοντας έλεγχο χωρίς πολυπλοκότητα.
Portability (The Ultimate Advantage):
- This is the crucial point.
- Το ίδιο αρχείο matmul.mojo μπορεί να επανασυναρμολογηθεί για να τρέξει σε NVIDIA GPU, AMD GPU, Intel CPU με AVX512 ή Google TPU.
- The logic remains the same; the compiler backend changes.
- The CUDA code would require a complete, costly rewrite for each new hardware target.
- Το Mojo προσφέρει "φορητότητα απόδοσης", σπάζοντας το κλείδωμα του προμηθευτή και εξασφαλίζοντας τον κώδικα για το μέλλον.
MLIR-based Mojo is undeniably set to replace LLVM-based CUDA, and developers will enjoy the change!
MLIR-based Mojo is undeniably set to replace LLVM-based CUDA, and developers will enjoy the change!
Για περισσότερα στο Mojo, ανατρέξτε στο άρθρο παρακάτω:
Example 2: Gen AI and the Transformer Attention Mechanism
Παράδειγμα 2: Η γενετική AI και ο μηχανισμός προσοχής των μετασχηματιστώνΟ μηχανισμός "προσοχής" είναι η καρδιά των μοντέλων όπως το GPT-4 και είναι ένα σημαντικό υπολογιστικό εμπόδιο.
Η βελτιστοποίηση του είναι κρίσιμη.
Optimizing it is critical.
The CUDA Implementation (Conceptual FlashAttention)
Το FlashAttention είναι ένας ορόσημος αλγόριθμος που οργανώνει χειροκίνητα και εξειδικευμένα την κίνηση δεδομένων μεταξύ της αργής κύριας μνήμης (HBM) της GPU και της γρήγορης μνήμης σε τσιπ (SRAM) για να μειώσει τα εμπόδια.
Ο πραγματικός κώδικας είναι χιλιάδες γραμμές μακράς και απίστευτα περίπλοκος.
The real code is thousands of lines long and incredibly complex.
Οι σύνδεσμοι προς τα στοιχεία της πλήρους εφαρμογής αλγορίθμου παρέχονται παρακάτω:
https://github.com/Dao-AILab/flash-attention/blob/main/csrc/flash_attn/src/flash_fwd_kernel.h
https://github.com/Dao-AILab/flash-attention/blob/main/csrc/flash_attn/flash_api.cpp
Μαζί, είναι σχεδόν 3000 γραμμές.
The repository contains thousands of files.
The learning curve and the onboarding curve are both steep.
Μια απλοποιημένη έκδοση (γεννημένη από AI) δίνεται παρακάτω:
(CUDA C++)
// This is a simplified conceptual view of a FlashAttention-style CUDA kernel.
// The actual implementation is far more complex.
template<typename Kernel_traits>
__global__ void flash_attention_fwd_kernel(Flash_fwd_params params) {
// 1. Incredibly complex setup code
// Calculates dozens of pointers and indices for HBM and shared memory (SRAM)
const int block_row_idx = blockIdx.x;
const int head_idx = blockIdx.y;
// ... many more calculations ...
// 2. Explicitly allocate shared memory tiles for Q, K, V
// The developer must manage this limited resource manually.
extern __shared__ char smem[];
float* sQ = (float*)smem;
float* sK = sQ + kTileM * kTileK;
float* sV = sK + kTileN * kTileK;
// 3. Main loop over the sequence, manually loading blocks
for (int k_block_idx = 0; k_block_idx < params.k_num_blocks; ++k_block_idx) {
// Manually orchestrate asynchronous loads from HBM into SRAM
// to hide memory latency. This is extremely difficult to get right.
load_qkv_block_from_hbm(params, ...);
__syncthreads(); // Hard synchronization barrier
// Manually perform matrix multiplication in fast SRAM
compute_sram_matmul(sQ, sK, ...);
// Recompute softmax "online" to avoid writing the huge intermediate
// attention score matrix back to slow HBM. This is the core trick.
compute_online_softmax(...);
__syncthrows();
// Update the output block
update_output_block(sV, ...);
}
// 4. Manually write the final output block back to HBM
store_output_to_hbm(params, ...);
}
Analysis of the CUDA/FlashAttention Approach:
Analysis of the CUDA/FlashAttention Approach:- Είναι ένα αριστούργημα της χειροκίνητης, ειδικής μηχανικής υλικού.
- Επιτυγχάνει απίστευτες επιδόσεις, αντιμετωπίζοντας την GPU σαν ένα χειροκίνητα προγραμματισμένο μηχάνημα.
- Αυτό καθιστά τον κώδικα σχεδόν αδιάβαστο, μη διατηρήσιμο και μη φορητό.
- Only a handful of world-class experts can write or modify such code.
- It represents the peak of performance within a closed ecosystem, but also the peak of complexity and rigidity.
The Conceptual Mojo Implementation
Η εννοιολογική εφαρμογή του MojoThe Mojo version expresses the same algorithmic idea(tiling, online softmax) σε υψηλό επίπεδο, αναθέτοντας την ορχήστρα του υλικού στον μεταγλωττιστή MLIR.
Μωάμεθ :)
from memory import DType, Tensor
from algorithm import parallelize
struct AttentionParams:
var is_causal: Bool
# ... other model parameters
# This function is a high-level, portable description of the FlashAttention algorithm.
fn flash_attention[T: DType](Q: Tensor[T], K: Tensor[T], V: Tensor[T], params: AttentionParams) -> Tensor[T]:
# Define problem dimensions from input tensors
let num_batches = Q.dim(0)
let num_heads = Q.dim(2)
let seqlen_q = Q.dim(1)
let seqlen_k = K.dim(1)
# Define tunable tiling parameters. The compiler can use these as hints.
alias BLOCK_M: Int = 128
alias BLOCK_N: Int = 64
# The output tensor
var O = Tensor[T](Q.dims)
# The @parallelize decorator tells the compiler to map this function
# over the available hardware parallelism (e.g., CUDA thread blocks or CPU cores).
@parallelize(num_batches * num_heads)
fn compute_head(batch_idx: Int, head_idx: Int):
# Define per-worker accumulators. The compiler will map these
# to the fastest available memory (e.g., registers or SRAM).
var o_i = Tensor[T](seqlen_q, V.dim(3))
var l_i = Tensor[T](seqlen_q) # Stores the denominator of the softmax
var m_i = Tensor[T](seqlen_q) # Stores the max of each row for stable softmax
o_i.zero()
l_i.fill(0.0)
m_i.fill(-50000.0) # Negative infinity
# Loop over blocks of the Key/Value sequence
for j in range(0, seqlen_k, BLOCK_N):
# 1. Load tiles of K and V.
# The compiler is responsible for generating the optimal code
# to move this data from main memory to fast memory.
let k_j = K.load_tile[BLOCK_N](batch_idx, j, head_idx)
let v_j = V.load_tile[BLOCK_N](batch_idx, j, head_idx)
# Loop over blocks of the Query sequence
for i in range(0, seqlen_q, BLOCK_M):
# 2. Load tile of Q.
let q_i = Q.load_tile[BLOCK_M](batch_idx, i, head_idx)
# 3. Compute attention scores for the tile. This is a simple matmul.
let s_ij = q_i @ k_j.transpose()
# Causal masking for decoder models like GPT
if params.is_causal:
# Algorithmic logic, no hardware specifics
apply_causal_mask(s_ij, i, j)
# 4. Perform the "online softmax" update.
# This is pure mathematical logic, not memory management.
let m_ij = row_max(s_ij)
let p_ij = exp(s_ij - m_ij)
let l_ij = row_sum(p_ij)
let m_new = max(m_i, m_ij)
let l_new = exp(m_i - m_new) * l_i + exp(m_ij - m_new) * l_ij
# Update output tile
o_i = (l_i / l_new * exp(m_i - m_new)) * o_i + (exp(m_ij - m_new) / l_new) * (p_ij @ v_j)
# Update softmax stats
l_i = l_new
m_i = m_new
# 5. Store the final output. The compiler manages the write-back.
O.store_tile(batch_idx, head_idx, o_i)
compute_head()
return O
Ένα αρχείο
Λιγότερο από 100 θέσεις.
No brain-racking dependencies.
Φυσικά, αυτός είναι μόνο ο αλγόριθμος, αλλά στο αποθετήριο, ο ίδιος αλγόριθμος πήρε σχεδόν 3000 LOC με CUDA!
Of course, this is just the algorithm, but in the repository, the same algorithm took nearly 3000 LOC with CUDA!
Τώρα καταλαβαίνετε τη διαφορά:
So now you understand the difference:
Mojo is Game-Changing for AI:
Το Mojo είναι game-changing για το AI:Separation of Concerns:
- Ο κώδικας Mojo περιγράφει τον αλγόριθμο.
- Ο κώδικας CUDA περιγράφει μια χειροκίνητη υλοποίηση υλικού.
- Αυτή είναι μια βαθιά διαφορά.
- Ο προγραμματιστής Mojo μπορεί να επικεντρωθεί στη βελτίωση του αλγορίθμου:
- Ενώ ο μεταγλωττιστής MLIR επικεντρώνεται στη χαρτογράφηση του σε πυρίτιο.
Research Velocity and Maintainability:
- Ένας ερευνητής AI μπορεί εύκολα να κατανοήσει και να τροποποιήσει αυτόν τον κώδικα Mojo για να δοκιμάσει μια νέα ιδέα.
- Modifying the CUDA code would be a massive, time-consuming engineering project requiring a rare skillset.
- Αυτό επιταχύνει δραματικά τον κύκλο έρευνας και ανάπτυξης.
Hardware Freedom:(Η πιο σημαντική
- Αυτός ο κώδικας Mojo δεν συνδέεται με τη NVIDIA.
- It can be compiled to run on:
- AMD GPUs
- Google TPUs
- Intel Gaudi
- Custom AI chips.
- Any architecture there is!
- MLIR's dialects can be extended to support any new hardware:
- Making the Mojo code truly future-proof.
Αυτό θα σπάσει το μονοπώλιο της NVIDIA στην υψηλής απόδοσης τεχνητή νοημοσύνη και θα μειώσει το κόστος.
This breaks the NVIDIA monopoly on high-performance AI and will drive down costs.
Specialized Hardware and Future Domains
Εξειδικευμένο υλικό και μελλοντικοί τομείςΟι περιορισμοί του μοντέλου CUDA γίνονται ακόμη πιο εμφανείς όταν κοιτάζουμε πέρα από τα παραδοσιακά πυκνά φορτία εργασίας στο μέλλον της πληροφορικής.
The limitations of the CUDA model become even more apparent when we look beyond traditional dense workloads to the future of computing.
Το MLIR/Mojo έχει σχεδιαστεί για αυτό το μέλλον.
MLIR/Mojo is designed for this future.
Blockchain, Mining, and ASICs
Blockchain, Mining, and ASICsProof-of-Work blockchains like Bitcoin require immense hashing power.
Ο στόχος είναι να βρεθεί ένα "nonce" που, όταν hashed με άλλα δεδομένα, παράγει ένα αποτέλεσμα κάτω από ένα συγκεκριμένο στόχο.
Αυτή είναι μια αναζήτηση ακαθάριστης δύναμης, ιδανική για παράλληλο υλικό.
Initially, miners used CPUs, then GPUs for their superior parallelism.
The CUDA code for a SHA-256 miner is low-level, focused on bitwise and integer operations.
Ωστόσο, για έναν σταθερό, αμετάβλητο αλγόριθμο όπως το SHA-256, το τελικό υλικό είναι ένα ASIC.
However, for a stable, unchanging algorithm like SHA-256, the ultimate hardware is an ASIC.
An ASIC (Application-Specific Integrated Circuit) is a chip designed for one single purpose - to implement an algorithm in hardware.
Ένα ASIC (Application-Specific Integrated Circuit) είναι ένα τσιπ σχεδιασμένο για έναν μόνο σκοπό - να εφαρμόσει έναν αλγόριθμο στο υλικό.
An SHA-256 ASIC has the hashing logic literally baked into the silicon.
Είναι χιλιάδες φορές πιο αποδοτική από μια GPU για αυτή τη μία εργασία.
This is where the CUDA story ends, but the MLIR/Mojo story gets even more interesting.
This is where the CUDA story ends, but the MLIR/Mojo story gets even more interesting.Η διαδικασία σχεδιασμού ενός τσιπ ονομάζεται σύνθεση υψηλού επιπέδου (HLS).
Τα εργαλεία HLS μετατρέπουν μια περιγραφή υψηλού επιπέδου ενός αλγορίθμου σε μια γλώσσα περιγραφής υλικού χαμηλού επιπέδου (όπως το Verilog ή το VHDL) που χρησιμοποιείται για την κατασκευή του τσιπ.
Το MLIR, μέσω έργων όπως το CIRCT (Circuit IR for Compilers and Tools), έχει σχεδιαστεί για να είναι η ραχοκοκαλιά της επόμενης γενιάς HLS.
MLIR, through projects like CIRCT (Circuit IR for Compilers and Tools), is designed to be the backbone of next-generation HLS.
- Ένας προγραμματιστής θα μπορούσε να γράψει έναν αλγόριθμο hashing στο Mojo.
- Για την εξόρυξη GPU, θα το συντάξουν χρησιμοποιώντας το backend GPU.
- Για να δημιουργήσουν ένα ASIC, θα μπορούσαν να συντάξουν τον ίδιο ακριβώς κώδικα Mojo χρησιμοποιώντας ένα backend HLS.
- Η υποδομή MLIR θα κατεβάσει τη λογική Mojo υψηλού επιπέδου στο Verilog.
Αυτό ενοποιεί ολόκληρο το στοίβα, από το λογισμικό υψηλού επιπέδου μέχρι το προσαρμοσμένο σχεδιασμό πυριτίου.
Επιτρέπει την ταχεία κατασκευή πρωτοτύπων και την ανάπτυξη νέων αλγορίθμων στο πιο αποδοτικό δυνατό υλικό, είτε πρόκειται για GPU είτε για νέο ASIC.
Η Κούβα δεν έχει καμία απάντηση σε αυτό.
Η Κούβα δεν έχει καμία απάντηση σε αυτό.
It is a software-only solution for a single vendor's programmable hardware.
Neuromorphic Computing and Sparse Data
Νευρομορφικός Υπολογισμός και Σπαράζ ΔεδομένωνΟι GPUs της NVIDIA είναι κύριοι του SIMT: Single Instruction, Multiple Thread.
NVIDIA GPUs are masters of SIMT: Single Instruction, Multiple Thread.
Αυτό σημαίνει ότι είναι απίστευτα αποτελεσματικά όταν χιλιάδες νήματα εκτελούν όλες την ίδια εντολή σε διαφορετικά δεδομένα (π.χ. πολλαπλασιασμός μήκους).
Ωστόσο, είναι πολύ αναποτελεσματικά σε φορτία εργασίας με βαριά διαίρεση ή ακανόνιστη πρόσβαση σε δεδομένα.
Αυτό οφείλεται στην «διαφοροποίηση των ραβδιών».
Εάν τα νήματα σε μια ομάδα (ένα "warp") παίρνουν διαφορετικά κλαδιά μιας δήλωσης if/else, το υλικό πρέπει να εκτελέσει και τις δύο διαδρομές σε σειρά, με τα νήματα στην αδρανής διαδρομή απλώς να απενεργοποιούνται.
If threads in a group (a "warp") take different branches of an if/else statement, the hardware must execute both paths serially, with threads in the inactive path simply turned off.
ΔύοΑυτό σκοτώνει την απόδοση για πολλά σημαντικά προβλήματα.
Neuromorphic Computing:
This is a brain-inspired computing paradigm.
Τα νευρομορφικά τσιπ, όπως το Loihi της Intel, δεν βασίζονται σε ρολόγια και πυκνά μαθηματικά μήτρας.
Είναι εκδηλώσεις προσανατολισμένες.
They are event-driven.
Οι "νευρώνες" πυροβολούν μια "πυξίδα" μόνο όταν το δυναμικό εισόδου τους υπερβαίνει ένα κατώφλι.
Αυτές οι κορυφές ταξιδεύουν σε άλλες «συναπασίες», οι οποίες μπορεί στη συνέχεια να προκαλέσουν άλλες νευρώνες να πυροδοτήσουν.
Πρόκειται για μια εξαιρετικά σπάνια, βαριά και ασύγχρονη διαδικασία.
Προσπαθώντας να προσομοιώσετε αυτό σε μια GPU είναι τρομερά αναποτελεσματική λόγω της συνεχούς απόκλισης του νήματος.
Trying to simulate this on a GPU is horrifically inefficient due to constant thread divergence.
MLIR is the perfect solution for this.
Το MLIR είναι η τέλεια λύση για αυτό.
Το MLIR είναι η τέλεια λύση για αυτό.
- Μια «νευρομορφική διάλεκτος» μπορεί να δημιουργηθεί μέσα στο MLIR.
- Αυτή η διάλεκτος θα είχε λειτουργίες πρώτης κατηγορίας για Spike, Synapse, NeuronUpdate.
- Ένας προγραμματιστής θα μπορούσε να γράψει έναν νευρομορφικό αλγόριθμο στο Mojo χρησιμοποιώντας αυτές τις έννοιες υψηλού επιπέδου.
- The MLIR compiler, with a backend for a specific neuromorphic chip like Loihi, would translate these concepts into the chip's native, event-driven instructions.
Αυτό επιτρέπει ένα φορητό μοντέλο προγραμματισμού υψηλού επιπέδου για μια εντελώς μη παραδοσιακή μορφή υπολογισμού.
Το μοντέλο CUDA δεν είναι σχετικό σε αυτόν τον τομέα.
The CUDA model is not relevant in this domain.
Sparse and Graph Data:
Πληροφορίες Sparse και Graph:Πολλά προβλήματα του πραγματικού κόσμου περιλαμβάνουν σπάνια δεδομένα: κοινωνικά δίκτυα, μηχανές συστάσεων και επιστημονικές προσομοιώσεις.
Representing these as dense matrices is wasteful.
Αντιπροσωπεύοντας αυτά ως πυκνές μήτρες είναι σπατάλη.
Η επεξεργασία τους σε GPUs οδηγεί σε ακανόνιστα πρότυπα πρόσβασης μνήμης, τα οποία νικούν τις βελτιστοποιήσεις συγχώνευσης μνήμης της GPU και μειώνουν την απόδοση.
Again, MLIR provides the answer.
- Μια "διαλεκτική γραφήματος" ή "διαλεκτική σπάνιας τάσης" μπορεί να αντιπροσωπεύει αυτές τις δομές δεδομένων με φυσικό τρόπο.
- Ο μεταγλωττιστής μπορεί στη συνέχεια να εφαρμόσει εξειδικευμένες βελτιστοποιήσεις για την αντιμετώπιση της σπανιότητας.
- Για παράδειγμα, μπορεί να αναδιοργανώσει τους κόμβους για να βελτιώσει τη θέση της μνήμης ή να χρησιμοποιήσει συμπιεσμένες μορφές αποθήκευσης.
-
Αυτό επιτρέπει έναν αλγόριθμο υψηλού επιπέδου γραμμένο στο Mojo να συντάσσεται αποτελεσματικά για σπάνια δεδομένα σε οποιοδήποτε υλικό.
This allows a high-level algorithm written in Mojo to be efficiently compiled for sparse data on any hardware.
Αυτό είναι κάτι που είναι εξαιρετικά δύσκολο σήμερα.
Και δίπλα στο αδύνατο με το CUDA.
Και δίπλα στο αδύνατο με το CUDA.
Quantum Computing Simulation
Κβαντική προσομοίωση υπολογιστώνSimulating a quantum computer on a classical computer is essential for developing and testing quantum algorithms.
Η πιο συνηθισμένη μέθοδος είναι η προσομοίωση κρατικών φορέων.
Η κατάσταση ενός κβαντικού συστήματος N-qubit αντιπροσωπεύεται από έναν φορέα 2^N πολύπλοκων αριθμών.
Για μόλις 50 qubits, αυτός ο φορέας έχει 2^50 (πάνω από ένα τετραεκατομμύριο) στοιχεία, που απαιτούν petabytes μνήμης.
For just 50 qubits, this vector has 2^50 (over a quadrillion) elements, requiring petabytes of memory.
Ένας κβαντικός αλγόριθμος είναι μια ακολουθία «πύλων».
Κάθε πύλη ισοδυναμεί με τον πολλαπλασιασμό του μαζικού κρατικού φορέα με μια πολύ μεγάλη, πολύ σπάνια μήτρα.
Αυτό είναι ένα φορτίο εργασίας που είναι τόσο υπολογιστικά έντονο όσο και συνδεδεμένο με το εύρος ζώνης μνήμης.
Η NVIDIA έχει επενδύσει σημαντικά εδώ με τη βιβλιοθήκη cuQuantum, μια λύση υψηλής απόδοσης βασισμένη σε CUDA.
Το cuQuantum είναι πολύ γρήγορο σε GPUs NVIDIA, αλλά έχει τους κλασικούς περιορισμούς CUDA:
- Vendor Lock-In: Η κβαντική προσομοίωση είναι συνδεδεμένη με το υλικό της NVIDIA.
- Βελτιστοποίηση χαμηλού επιπέδου: Ο μεταγλωττιστής βλέπει μόνο πολλαπλασιασμούς μήτρας-βέκτορα.
- Χωρίς πλεονέκτημα τομέα: Δεν έχει βελτιστοποιήσεις για την κβαντική μηχανική, βασισμένη στο LLVM (το σημασιολογικό κενό).
The MLIR/Mojo Advantage for Quantum Simulation:
Τα πλεονεκτήματα του MLIR/Mojo για την κβαντική προσομοίωση:Η προσέγγιση MLIR επιτρέπει ένα πολύ υψηλότερο επίπεδο νοημοσύνης στον μεταγλωττιστή.
- Μια «κβαντική διάλεκτος» μπορεί να οριστεί στο MLIR.
- Αυτή η διάλεκτος δεν θα εκπροσωπούσε τις πύλες ως μήτρες, θα τις εκπροσωπούσε ως κβαντικά αντικείμενα: Hadamard, CNOT, Toffoli.
- Ένας προγραμματιστής θα έγραφε το κβαντικό τους κύκλωμα στο Mojo χρησιμοποιώντας αυτά τα αντικείμενα υψηλού επιπέδου.
- Ο μεταγλωττιστής MLIR μπορεί στη συνέχεια να εκτελέσει κβαντικές βελτιστοποιήσεις πριν ακόμη δημιουργηθούν τυχόν μήτρες.
Για παράδειγμα, ο μεταγλωττιστής θα ήξερε ότι η εφαρμογή μιας πύλης Hadamard (H) δύο φορές στη σειρά είναι μια λειτουργία ταυτότητας και μπορεί να εξαλειφθεί εντελώς.
Θα ήξερε ότι ορισμένες αλληλουχίες πύλων μπορούν να «συνδυαστούν» σε μια ενιαία, πιο αποτελεσματική πύλη.
Για παράδειγμα, ο μεταγλωττιστής θα ήξερε ότι η εφαρμογή μιας πύλης Hadamard (H) δύο φορές στη σειρά είναι μια λειτουργία ταυτότητας και μπορεί να εξαλειφθεί εντελώς.
Θα ήξερε ότι ορισμένες αλληλουχίες πύλων μπορούν να «συνδυαστούν» σε μια ενιαία, πιο αποτελεσματική πύλη.
Αυτή είναι μια ολόκληρη κατηγορία βελτιστοποίησης που είναι αόρατη για τον μεταγλωττιστή CUDA, ο οποίος βλέπει μόνο γενικές μήτρες, χάρη στο LLVM.
This is an entire class of optimization that is invisible to the CUDA compiler, which only sees generic matrices, thanks to LLVM.
Μετά την εκτέλεση αυτών των υψηλού επιπέδου αλγεβρικών απλοποιήσεων, ο μεταγλωττιστής MLIR θα κατεβάσει το απλοποιημένο κύκλωμα σε μια βελτιστοποιημένη ακολουθία σπάνιων λειτουργιών μήτρας για το υλικό-στόχο.
Επειδή όλα αυτά είναι χτισμένα στο MLIR, το ίδιο υψηλού επιπέδου κβαντικό κύκλωμα που γράφτηκε στο Mojo θα μπορούσε να συντάσσεται για να τρέξει σε μια GPU NVIDIA, μια GPU AMD ή ένα σύμπλεγμα CPU.
Because this is all built on MLIR, the same high-level quantum circuit written in Mojo could be compiled to run on an NVIDIA GPU, an AMD GPU, or a CPU cluster.
Αυτό παρέχει τόσο υψηλότερη απόδοση (λόγω πιο έξυπνης βελτιστοποίησης) όσο και πλήρη ελευθερία υλικού.
Η Nvidia επενδύει σε μεγάλο βαθμό σε υλικό κβαντικής προσομοίωσης και στο πακέτο λογισμικού.
Αλλά η πλατφόρμα CUDA-Q εξακολουθεί να βασίζεται στο LLVM.
Το Mojo με βάση το MLIR δεν μπορεί μόνο να προσφέρει προηγμένη βελτιστοποίηση - προσφέρει επίσης απλούστερο προγραμματισμό.
MLIR-based Mojo can not just offer advanced optimization - it also offers simpler programming.
Final Verdict: Today vs. The Inevitable Future
ΤΕΛΙΚΗ ΑΠΟΦΑΣΗ: ΣΗΜΕΡΑ ΕΝΑΝΤΙΟΝ ΤΟΥ ΑΝΑΠΟΦΕΥΓΜΕΝΟΥ ΜΕΛΛΟΝΤΟΣThe Verdict Today (2025):
Η Κρίση Σήμερα (2025):- Ο ΚΟΥΔΑ είναι ο βασιλιάς του λόφου και ο λόφος είναι μεγάλος.
- Το ώριμο οικοσύστημα, οι εκτεταμένες βιβλιοθήκες και η τεράστια κοινότητα είναι ισχυρά περιουσιακά στοιχεία.
- Για μια ομάδα που έχει ήδη επενδύσει στο υλικό της NVIDIA και χρειάζεται να στείλει ένα προϊόν αμέσως, το CUDA είναι η ρεαλιστική επιλογή.
- Η αδράνεια μιας δεκαετίας κυριαρχίας είναι μια ισχυρή δύναμη.
- Ο Mojo είναι ακόμα νέος.
- Το οικοσύστημα του αναπτύσσεται με απίστευτη ταχύτητα, αλλά δεν μπορεί ακόμα να ταιριάζει με το εύρος των δοκιμασμένων βιβλιοθηκών του CUDA.
The Verdict for the Long Run:
The Verdict for the Long Run:- Το μέλλον είναι ετερογενές.
- Αυτό δεν είναι εικασία, είναι πραγματικότητα.
- Η άνοδος του προσαρμοσμένου πυριτίου τεχνητής νοημοσύνης και ο ανανεωμένος ανταγωνισμός από την AMD και την Intel έχουν καταστήσει το μπλοκάρισμα των προμηθευτών έναν απαράδεκτο επιχειρηματικό και τεχνικό κίνδυνο.
- Τα προβλήματα του μέλλοντος - σπάνια δεδομένα, νευρομορφική τεχνητή νοημοσύνη, εξόρυξη blockchain και κβαντικός υπολογισμός - δεν ταιριάζουν καλά στο άκαμπτο μοντέλο SIMT των σημερινών GPU.
- Το MLIR είναι η μόνη υπάρχουσα, υποστηριζόμενη από τη βιομηχανία αρχιτεκτονική που έχει σχεδιαστεί για να λύσει αυτό το πρόβλημα.
- Η υιοθέτησή του από την Google, την Apple, την Intel, την AMD και την ARM είναι ένα σαφές μήνυμα του κεντρικού του ρόλου στο μέλλον των μεταγλωττιστών.
- Το Mojo είναι η μόνη γλώσσα που έχει κατασκευαστεί (ακόμη) για να αξιοποιήσει αυτή τη δύναμη.
Μωάμεθ :
- Η επίλυση του προβλήματος των δύο γλωσσών
- Συνδυάστε τη χρησιμότητα με την απόδοση
- Προσφέρει μια πύλη σε ολόκληρο το οικοσύστημα MLIR.
Η μετάβαση από το CUDA σε έναν κόσμο που βασίζεται στο MLIR θα είναι σταδιακή, αλλά αναπόφευκτη.
Πρόκειται για μια θεμελιώδη μετάβαση από ένα κλειστό, κεντρικό μοντέλο υλικού σε ένα ανοικτό, καθορισμένο από το λογισμικό μέλλον.
Τα μειονεκτήματα του Mojo
- Το Mojo βρίσκεται ακόμα σε εξέλιξη.
- Ακόμα δεν έχει καν τάξεις.
- Οι βιβλιοθήκες τρίτων είναι λίγες, αλλά αναπτύσσονται με απίστευτο ρυθμό.
- Έχει εφαρμογές παντού όπου χρησιμοποιείται η Python - αλλά πρέπει να εξελιχθεί με την Python.
- Όλη η γλώσσα δεν είναι ακόμα ανοιχτού κώδικα, αν και οι ειδικοί λένε ότι αυτό σύντομα θα αλλάξει.
- Δεν υποστηρίζει τα Windows (ακόμη).
- Και απαιτεί μεταφορά σε συστήματα Android, iOS και Edge IOT.
Αλλά θα είναι ο νικητής μακροπρόθεσμα;
I believe it will, and developers will be happier with Mojo than CUDA.
Συμπέρασμα
Η CUDA έχτισε το εντυπωσιακό παλάτι της σημερινής υπολογιστικής υψηλών επιδόσεων.
CUDA built the impressive palace of today's high-performance computing.
Αλλά είναι ένα κλουβί.
But it is a cage.
Η MLIR και η Mojo δίνουν σε κάθε προγραμματιστή το κλειδί για να το ξεκλειδώσει και να χτίσει το μέλλον πάνω σε οποιοδήποτε θεμέλιο επιλέγει.
MLIR and Mojo are handing every developer the key to unlock it and build the future on any foundation they choose.
Και αυτό το ίδρυμα προορίζεται να είναι MLIR και Mojo.
Και αυτό το ίδρυμα προορίζεται να είναι MLIR και Mojo.
The simplest reason - the budget.
Ο προϋπολογισμός .Αυτός είναι ο λόγος για τον οποίο, εκτός αν η Nvidia pivots, και σύντομα:
Αυτό θα είναι το τέλος της κυριαρχίας της Nvidia - εκτός αν αγκαλιάσουν και το MLIR!
This will be the end of the dominance of Nvidia - unless they embrace MLIR as well!
Αναφορές
Official Project Pages
- MLIR (Multi-Level Intermediate Representation)
- Text description: The official homepage for the MLIR project, hosted by LLVM. This is the canonical source for documentation, talks, and the project's overall mission statement.
- https://mlir.llvm.org/
- Mojo Programming Language
- The official documentation for the Mojo programming language from Modular, the company that created it. This is the primary resource for learning the language.[2]
- https://docs.modular.com/mojo/
- NVIDIA CUDA Toolkit
- The official portal from NVIDIA for downloading the CUDA Toolkit, which includes the compilers, libraries, and tools necessary for CUDA development.
- https://developer.nvidia.com/cuda-toolkit
- LLVM Compiler Infrastructure Project
- The main homepage for the LLVM project, which provides an overview of the entire ecosystem, including Clang, LLDB, and other sub-projects. MLIR is a part of this larger project.
- https://llvm.org/
- Chris Lattner's Homepage
- The personal homepage of Chris Lattner, the creator of LLVM, Clang, Swift, MLIR, and Mojo. It provides his work history and links to his talks and papers, offering direct insight into the creation of these technologies.
- https://nondot.org/sabre/
AI and Attention Mechanism (FlashAttention)
- FlashAttention Original Paper (arXiv)
- The original scientific paper, "FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness," which introduced the algorithm. This is the primary source for understanding the technical details and performance benefits.
- https://arxiv.org/abs/2205.14135
- FlashAttention-2 Paper (arXiv)
- The follow-up paper describing FlashAttention-2, which details further optimizations for parallelism and work partitioning to achieve even greater speedups on modern GPUs.
- https://arxiv.org/abs/2307.08691
- FlashAttention GitHub Repository
- The official GitHub repository containing the source code for the FlashAttention and FlashAttention-2 CUDA kernels.
- https://github.com/Dao-AILab/flash-attention
Quantum Computing Simulation
- NVIDIA cuQuantum Official Page
- NVIDIA's official product page for the cuQuantum SDK, outlining its features for accelerating quantum computing simulations on GPUs.
- https://developer.nvidia.com/cuquantum
- NVIDIA cuQuantum Documentation
- The detailed technical documentation for the cuQuantum SDK, providing a high-level overview and API references for the libraries.
- https://docs.nvidia.com/cuda/cuquantum/index.html
Specialized Hardware (Neuromorphic & ASICs)
- Intel Neuromorphic Computing Overview
- Intel's official overview of their neuromorphic computing research, which discusses the goals of the program and the Loihi research chips.
- https://www.intel.com/content/www/us/en/research/neuromorphic-computing.html
- CIRCT (Circuit IR Compilers and Tools) Project
- The official homepage for the CIRCT project, an LLVM/MLIR incubator looking to apply compiler technology to hardware design, including High-Level Synthesis (HLS) for FPGAs and ASICs.
- https://circt.llvm.org/
- CIRCT GitHub Repository
- The official GitHub repository for the CIRCT project, containing the source code, dialects, and tools for hardware compiler design.
- https://github.com/llvm/circt
Το Google AI Studio χρησιμοποιήθηκε για την περιγραφή και την έρευνα για αυτό το άρθρο.
Το Google AI Studio χρησιμοποιήθηκε για την περιγραφή και την έρευνα για αυτό το άρθρο.
Όλες οι εικόνες δημιουργήθηκαν από τον συγγραφέα με το NightCafe Studio δωρεάν, διαθέσιμα στον παρακάτω σύνδεσμο:
Όλες οι εικόνες δημιουργήθηκαν από τον συγγραφέα με το NightCafe Studio δωρεάν, διαθέσιμα στον παρακάτω σύνδεσμο:
https://creator.nightcafe.studio/