Create src/f1_kernel_core.cpp
Browse files- src/f1_kernel_core.cpp +29 -0
src/f1_kernel_core.cpp
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// Fichier : f1_kernel_core.cpp
|
| 2 |
+
#include <immintrin.h> // Accès aux instructions vectorielles (le "moteur" du F-1)
|
| 3 |
+
|
| 4 |
+
extern "C" {
|
| 5 |
+
// Le Kernel F-1 : Multiplication de matrices ultra-optimisée
|
| 6 |
+
void launch_f1_kernel(float* A, float* B, float* C, int size) {
|
| 7 |
+
// On traite les données par blocs de 8 nombres à la fois (Vectorisation)
|
| 8 |
+
for (int i = 0; i < size; ++i) {
|
| 9 |
+
for (int k = 0; k < size; ++k) {
|
| 10 |
+
// Chargement d'une valeur de A en mode "Broadcast"
|
| 11 |
+
__m256 a_vec = _mm256_set1_ps(A[i * size + k]);
|
| 12 |
+
|
| 13 |
+
for (int j = 0; j < size; j += 8) {
|
| 14 |
+
// Chargement de 8 valeurs de B
|
| 15 |
+
__m256 b_vec = _mm256_loadu_ps(&B[k * size + j]);
|
| 16 |
+
// Chargement des résultats actuels dans C
|
| 17 |
+
__m256 c_vec = _mm256_loadu_ps(&C[i * size + j]);
|
| 18 |
+
|
| 19 |
+
// L'opération FMA (Fused Multiply-Add) : C = A * B + C
|
| 20 |
+
// C'est le cœur de la puissance du GPU-NANO F-1
|
| 21 |
+
c_vec = _mm256_fmadd_ps(a_vec, b_vec, c_vec);
|
| 22 |
+
|
| 23 |
+
// Stockage du résultat
|
| 24 |
+
_mm256_storeu_ps(&C[i * size + j], c_vec);
|
| 25 |
+
}
|
| 26 |
+
}
|
| 27 |
+
}
|
| 28 |
+
}
|
| 29 |
+
}
|