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