Optimisé pour NVIDIA GB10 Grace Blackwell

Pipeline CPU↔GPU
Zéro-Copie Adaptatif

Librairie CUDA haute performance exploitant la mémoire partagée cohérente. Routing automatique des jobs vers le mode GPU optimal. Jusqu'à 7.6x plus rapide que cudaMemcpy pour les buffers < 256 Ko.

7.6x
Speedup pic (16 Ko)
3
Modes GPU adaptatifs
15.6
GB/s débit max
0
Copies mémoire (zéro-copy)

Runtime GPU adaptatif

UnifiedFlow v3.0 transforme un pipeline expérimental en une librairie de production capable de s'adapter automatiquement à chaque type de charge de travail.

Zéro-Copie NVLink

Accès direct CPU↔GPU sans cudaMemcpy via la mémoire unifiée cohérente. Élimine totalement la latence de transfert pour les petits buffers.

🧠

Classification automatique

Le PolicyEngine analyse chaque job (taille, intensité compute) et le route vers le mode GPU optimal. Seuils configurables, override possible.

📊

3 Modes GPU spécialisés

Small (batch-pop), Large (1 CTA/job), Tiled (tile stealing coopératif). Chaque mode possède son kernel persistent et sa queue dédiée.

🔀

Multi-Queue sans blocage

3 queues indépendantes évitent le head-of-line blocking. Les petits jobs ne sont plus bloqués par les gros. Watermarks et backpressure.

🚀

Kernels persistants

Les 3 kernels GPU restent actifs en permanence et consomment les jobs sans redémarrage. Zéro overhead de lancement, latence minimale.

📑

API simplifiée JobFuture

Soumission asynchrone avec submit() retournant un JobFuture. Wait, polling non-bloquant, ou fire-and-forget.

Flux de données adaptatif

Un runtime léger qui classe, route et exécute chaque job avec la stratégie GPU optimale.

💻

CPU Producer (submit)

L'application soumet un job via pipeline.submit(data, size, op_kind). Zéro configuration requise.

🧠

PolicyEngine (classification)

Analyse la taille (bytes_in) et l'intensité compute (FLOP/byte). Détermine automatiquement : MODE_SMALL, MODE_LARGE ou MODE_TILED.

🔀

Multi-Queue (3 files lock-free)

Q_small, Q_large, Q_tiled — chacune avec ses watermarks, signaux stop/pause, et statistiques indépendantes.

BufferPool (mémoire unifiée)

64 buffers x 256 Ko en mémoire partagée cohérente. Accès zéro-copie via NVLink-C2C (900 Go/s).

🎬

GPU Persistent Kernels (3 streams)

kernel_small (256 threads, batch-pop), kernel_large (512 threads, streaming), kernel_tiled (256 threads, tile stealing). Exécution parallèle.

Trois stratégies spécialisées

Chaque mode est optimisé pour un profil de charge différent. Le PolicyEngine choisit automatiquement le meilleur.

MODE_SMALL (C)

Batch-Pop

1 CTA = N jobs

Idéal pour les petits buffers (< 64 Ko). Un CTA traite plusieurs jobs en séquence via batch-pop, réduisant la contention atomique.

  • Buffers < 64 Ko
  • 256 threads x 2 CTAs
  • Batch-pop jusqu'à 8 jobs
  • Speedup : 4.4x à 7.6x
  • Latence optimisée
MODE_LARGE (A)

Streaming CTA

1 job = 1 CTA

Pour les gros buffers (≥ 512 Ko). Chaque CTA prend un job complet et le traite en streaming via grid-stride loop.

  • Buffers ≥ 512 Ko
  • 512 threads x 4 CTAs
  • Grid-stride loop interne
  • Streaming mémoire optimal
  • Mode hybride cudaMemcpy ≥ 1 Mo
MODE_TILED (B)

Tile Stealing

1 job = N CTAs

Pour les charges compute-heavy (matmul, convolution, attention). Plusieurs CTAs coopèrent via vol de tuiles atomique.

  • Intensité ≥ 8 FLOP/byte
  • 256 threads x 8 CTAs
  • Découpage dynamique en tuiles
  • Scale avec le nombre de SMs
  • MatMul, Conv, Attention

Résultats mesurés sur GB10

Benchmarks réels exécutés sur NVIDIA GB10 Grace-Blackwell. CUDA 13.0.88, 20 jobs par taille.

📈 Débit comparé (Mo/s)

4 Ko
UnifiedFlow : 9.84
4 Ko
cudaMemcpy : 2.26
16 Ko
UnifiedFlow : 69.6
16 Ko
cudaMemcpy : 9.15
64 Ko
UnifiedFlow : 233.3
64 Ko
cudaMemcpy : 36.7

⚡ Speedup vs cudaMemcpy optimisé

Taille Speedup Gagnant
4 Ko 4.4x UnifiedFlow
16 Ko 7.6x UnifiedFlow
64 Ko 6.4x UnifiedFlow
256 Ko 1.2x UnifiedFlow
1 Mo 0.48x cudaMemcpy
4 Mo 0.20x cudaMemcpy
Zone de dominance par taille de buffer
UnifiedFlow domine 4 Ko – 256 Ko (4.4x à 7.6x)
Zone de transition 256 Ko – 1 Mo
cudaMemcpy (DMA) ≥ 1 Mo (mode hybride)
4 Ko 16 Ko 64 Ko 256 Ko 1 Mo 4 Mo 16 Mo

Recommandations par charge

Le mode hybride sélectionne automatiquement la meilleure stratégie selon votre profil applicatif.

🧠

Inférence temps réel

Tokens LLM, embeddings, petits tenseurs. UnifiedFlow élimine la latence de transfert pour les buffers < 16 Ko.

4-16 Ko MODE_SMALL 4-8x
🎧

Traitement audio

Segments audio, spectrogrammes, features Whisper. Sweet spot de performance à 16-64 Ko.

16-64 Ko MODE_SMALL 6-8x
🎨

Frames vidéo

Frames de caméra, prétraitement d'image, vision par ordinateur. Avantage significatif jusqu'à 256 Ko.

64-256 Ko MODE_SMALL/LARGE 1.2-6x
🔢

Multiplication matricielle

MatMul, convolution, attention. Le mode Tiled exploite le tile stealing pour saturer les SMs du GPU.

Compute-heavy MODE_TILED Scalable
📦

Transferts massifs

Gros fichiers, datasets, batch ML training. Le mode hybride bascule automatiquement sur cudaMemcpy (DMA).

≥ 1 Mo MODE_MEMCPY Automatique
🚀

Streaming haute fréquence

Milliers de petits jobs/seconde, IoT, capteurs, télémétrie. Le kernel persistent évite tout overhead de lancement.

< 4 Ko MODE_SMALL Zéro-launch

Interface simple et puissante

Soumettez des jobs en une seule ligne. La librairie gère le reste : classification, routing, exécution et récupération du résultat.

💻 Soumission simple

// Initialiser le pipeline
PipelineV3 pipeline(cfg);
pipeline.init();

// Soumettre un job (classification auto)
JobFuture fut = pipeline.submit(data, size,
    OpKind::TRANSFORM);

// Attendre le resultat
if (fut.wait(1000)) {
    process(fut.data(), fut.bytes());
}
pipeline.release(fut);

⚙ Configuration avancée

PipelineV3Config cfg;
cfg.num_buffers = 64;
cfg.bytes_per_buffer = 256 * 1024;

// Seuils de classification
cfg.policy.mode = PolicyMode::HYBRID;
cfg.policy.big_threshold = 512 * 1024;
cfg.policy.intensity_threshold = 8.0;
cfg.policy.memcpy_threshold = 1024 * 1024;

// Streams pour le mode hybride
cfg.memcpy_streams = 4;

PipelineV3 pipeline(cfg);

📊 Métriques et statistiques

auto st = pipeline.get_stats();

printf("Total : %lu jobs\n",
    st.jobs_processed);
printf("  Small : %lu\n", st.jobs_small);
printf("  Large : %lu\n", st.jobs_large);
printf("  Tiled : %lu\n", st.jobs_tiled);
printf("Tiles : %lu\n",
    st.tiles_processed);
printf("Bytes : %lu\n",
    st.total_bytes);

🚀 Soumission forcée / batch

// Forcer un mode specifique
auto fut = pipeline.submit_forced(
    data, size,
    ExecutionMode::MODE_TILED);

// Pause / Resume
pipeline.pause();
pipeline.resume();

// Drainer tous les jobs
pipeline.drain(5000);

// Arret propre
pipeline.stop();

Spécifications techniques

⚡ Plateforme cible

  • NVIDIA GB10 Grace Blackwell (ARM64)
  • NVLink-C2C 900 Go/s cohérent
  • CUDA 12.0+ (testé sur 13.0.88)
  • Compatible Hopper et Ampere

🔧 Build

  • C++17, CMake 3.24+
  • Librairie statique (.a) et partagée (.so)
  • GCC 9+ / NVCC 12+
  • CUDA Separable Compilation

📊 Runtime

  • 3 kernels persistants (3 streams)
  • 64 buffers x 256 Ko (mémoire unifiée)
  • 3 queues lock-free ring buffer
  • Mode hybride cudaMemcpy (≥ 1 Mo)

🔒 Robustesse

  • Ownership strict des buffers (FSM)
  • Backpressure avec watermarks
  • Arrêt propre via poison pills
  • Métriques par mode intégrées

Télécharger UnifiedFlow

Deux formats disponibles pour intégrer UnifiedFlow v3.0.1 PRO dans vos projets. Compilé pour ARM64 (NVIDIA GB10 Grace Blackwell).

📦
.so

Librairie partagée

Chargement dynamique à l'exécution. Idéal pour les systèmes partageant la librairie entre plusieurs applications.

  • libcpugpu_pipeline_v2.so
  • Linkage dynamique
  • Taille réduite de l'exécutable
  • Mise à jour sans recompilation
⬇ Télécharger .so
📦
.a

Librairie statique

Intégrée directement dans l'exécutable. Idéal pour le déploiement autonome sans dépendances externes.

  • libcpugpu_pipeline_v2.a
  • Linkage statique
  • Exécutable autonome
  • Zéro dépendance runtime
⬇ Télécharger .a

ⓘ Plateforme : ARM64 (aarch64-linux-gnu) — Requiert CUDA 12.0+ — C++17