une nouvelle approche pour la gestion de la mémoire avec cuda · 2020-03-09 · u t 6....
Post on 09-Aug-2020
0 Views
Preview:
TRANSCRIPT
Une nouvelle approche
pour la gestion de la
mémoire avec CUDA
Une nouvelle approche pour la gestion
de la mémoire avec CUDA
Concepts de base
Gérer la mémoire efficacement avec CUDA
Qu’est ce que UVA et UVM ?
Utiliser UVM dans une application
Introduction
Architecture d’une carte
graphique
Architecture d’une carte
graphique
Concepts de base
P
R
O
G
R
A
M
1
P
R
O
G
R
A
M
1
P
R
O
G
R
A
M
1
P
R
O
G
R
A
M
1
P
R
O
G
R
A
M
1
P
R
O
G
R
A
M
1
I
N
P
U
T
1
I
N
P
U
T
2
I
N
P
U
T
3
I
N
P
U
T
4
I
N
P
U
T
5
I
N
P
U
T
6
Architecture d’une carte
graphique
Concepts de base
MyCudaFunction<<<Block, Thread>>>(…);
Architecture d’une carte
graphique
Concepts de base
GPU
SM SM SM SM
Architecture d’une carte
graphique
Concepts de base
SM
CUDA Core CUDA Core CUDA Core
Architecture d’une carte
graphique
Concepts de base
GPU
SM SM SM SM
Block 1 Block 2 Block 3 Block 4
Block 5 Block 6 Block 7 Block 8
Block 9 Block 10 Block 11 Block 12
MyCudaFunction<<<12, …>>>(…);
Architecture d’une carte
graphique
Concepts de base
SM
Thread 1 Thread 2 Thread 3 Thread 4
Wrap
Architecture d’une carte
graphique
Concepts de base
SM
Thread 1 Thread 2 Thread 3 Thread 4
Wrap
Instruction;
If (…) {
}
else {
}
Instruction;
PTX: Parallel Thread Execution
Concepts de base
setp.lt.s32 p|q, a, b
@p bra Else
instructionA
bra End
Else:
instructionB
End:
instructionC
setp.lt.s32 p|q, a, b
@p InstructionA
@q InstructionB
InstructionC
CUDA Stream
Concepts de base
MyCudaFunction<<<Block, Thread, Stream>>>(…);
CUDA Stream
Concepts de base
Kernel Memcpy Kernel
MyCudaFunction<<<Block, Thread>>>(…);
Cumemcpy(…)
MyCudaFunction<<<Block, Thread>>>(…);
CUDA Stream
Concepts de base
Kernel
Memcpy Kernel
MyCudaFunction<<<Block, Thread, Stream1>>>(…);
Cumemcpy(…, Stream2)
MyCudaFunction<<<Block, Thread, Stream2>>>(…);
Gérer la mémoire efficacement
avec CUDA
Gérer la mémoire efficacement
avec CUDA
Gérer la mémoire efficacement avec CUDA
IO Thread Threads de calcul
Image Image
Image Image
Image Image
Disque
Chargement des images
Thread 1
Thread 2
Thread 3
Opération1 Opération2 Opération3
Opération1 Opération2 Opération3
Opération1 Opération2 Opération3
Gérer la mémoire efficacement
avec CUDA
Gérer la mémoire efficacement avec CUDA
IO Thread Threads de calcul
Image Image
Image Image
Image Image
Disque
Chargement des images
Thread 1
Thread 2
Thread 3
Opération1 Opération2 Opération3
Opération1 Opération2 Opération3
Opération1 Opération2 Opération3
Gérer la mémoire efficacement
avec CUDA
Gérer la mémoire efficacement avec CUDA
Opération2 (depuis Thread 1)
Opération2 (depuis Thread 2)
Opération2 (depuis Thread 3)
MemcpyCPU->GPU
MemcpyGPU->CPU
MemcpyGPU->CPU
MemcpyCPU->GPU
MemcpyCPU->GPU
MemcpyGPU->CPU
Thread 1 Thread 1 Thread 2 Thread 2 Thread 3 Thread 3
Gérer la mémoire efficacement
avec CUDA
Gérer la mémoire efficacement avec CUDA
IO Thread Threads de calcul
Image Image
Image Image
Image Image
Disque
Chargement des images
Thread 1
Thread 2
Thread 3
Opération1 Opération2 Opération3
Opération1 Opération2 Opération3
Opération1 Opération2 Opération3
Stream1
Stream2
Stream3
Gérer la mémoire efficacement
avec CUDA
Gérer la mémoire efficacement avec CUDA
Opération2 (depuis Thread 1)
Opération2 (depuis Thread 2)
Opération2 (depuis Thread 3)
MemcpyCPU->GPU
MemcpyGPU->CPU
MemcpyGPU->CPU
MemcpyCPU->GPU
MemcpyCPU->GPU
MemcpyGPU->CPU
Thread 1 Thread 1 Thread 3 Thread 3
Thread 2 Thread 2
Gérer la mémoire efficacement
avec CUDA
Gérer la mémoire efficacement avec CUDA
IO Thread Threads de calcul
Image Image
Image Image
Image Image
Disque
Chargement des images
Thread 1
Thread 2
Thread 3
Opération1 Opération2 Opération3
Opération1 Opération2 Opération3
Opération1 Opération2 Opération3
Stream1
Stream2
Stream3
Gérer la mémoire efficacement
avec CUDA
Gérer la mémoire efficacement avec CUDA
Opération2 (depuis Thread 1)
Opération2 (depuis Thread 1)
MemcpyCPU->GPU
MemcpyGPU->CPU
MemcpyGPU->CPU
MemcpyCPU->GPU
Thread 1 Thread 1
Gérer la mémoire efficacement
avec CUDA
Gérer la mémoire efficacement avec CUDA
Opération2 (depuis Thread 1)
Opération2 (depuis Thread 1)
MemcpyCPU->GPU
MemcpyGPU->CPU
Thread 1 Thread 1
Que faire si les opérations sont dans
des bibliothèques ?
Gérer la mémoire efficacement avec CUDA
Que faire si les opérations sont dans
des bibliothèques ?
Gérer la mémoire efficacement avec CUDA
Image 1
Image 1
GPU Memory
CPU Memory
Que faire si les opérations sont dans
des bibliothèques ?
Gérer la mémoire efficacement avec CUDA
Image 1
Image 1
GPU Memory
CPU Memory
Pointeur
?
Que faire si les opérations sont dans
des bibliothèques ?
Gérer la mémoire efficacement avec CUDA
Image 1
Image 1
GPU Memory
CPU Memory
?
Pointeur
Que faire si les opérations sont dans
des bibliothèques ?
Gérer la mémoire efficacement avec CUDA
Qu’est ce que UVA et UVM ?
Qu’est ce que UVA?
Qu’est ce que UVA et UVM ?
CPU VA Space
GPU VA Space
CPU Allocation
GPU Allocation VA Réservé
Description de UVA (Unified Virtual Address)
Qu’est ce que UVM?
Qu’est ce que UVA et UVM ?
CPU VA Space
GPU VA Space
CPU Allocation
GPU Allocation VA Réservé
Description de UVM (Unified Virtual Memory)
Mémoire UVM résidente
Mémoire UVM réservé
Qu’est ce que UVM?
Qu’est ce que UVA et UVM ?
CPU VA Space
GPU VA Space
CPU Allocation
GPU Allocation VA Réservé
Description de UVM (Unified Virtual Memory)
Mémoire UVM résidente
Mémoire UVM réservé
Qu’est ce que UVM?
Qu’est ce que UVA et UVM ?
CPU VA Space
GPU VA Space
CPU Allocation
GPU Allocation VA Réservé
Description de UVM (Unified Virtual Memory)
Mémoire UVM résidente
Mémoire UVM réservé
Qu’est ce que UVA et UVM ?
Qu’est ce que UVA et UVM ?
Utiliser UVM dans une application
Utiliser UVM dans une application
Utiliser UVM dans une application
Allocation d’un bloc de mémoire avec
UVM et creation d’un stream pour le
contenir.
CPU Memory GPU Memory
Block mémoire résident
Block mémoire réservé
Utiliser UVM dans une application
Utiliser UVM dans une application
CPU Memory GPU Memory
Block mémoire résident
Block mémoire réservé
Chargement de l’image dans le bloc
mémoire.
Utiliser UVM dans une application
Utiliser UVM dans une application
CPU Memory GPU Memory
Block mémoire résident
Block mémoire réservé
Binarization d”un bloc de l’image dans
UVM
Utiliser UVM dans une application
Utiliser UVM dans une application
CPU Memory GPU Memory
Block mémoire résident
Block mémoire réservé
Migration GPU -> CPU lorsque l’utilisateur
accède au données depuis le CPU.
Avantages
Utiliser UVM dans une application
Kernel 1 Kernel 2Memcpy
CPU->GPUMemcpy
GPU->CPUMemcpy
GPU->CPUMemcpy
CPU->GPU
Elimination des memcpy inutile automatique
Avantages
Utiliser UVM dans une application
Kernel 1 Kernel 2Memcpy
CPU->GPUMemcpy
GPU->CPU
Elimination des memcpy inutile automatique
Avantages
Utiliser UVM dans une application
Kernel 1 Opération CPUMemcpy
CPU->GPUMemcpy
GPU->CPU
Cohabitation entre bibliothèques utilisant CUDA et bibliothèques conventionnelles
MemcpyGPU->CPU
Fonction d’une bibliothèque utilisant CUDA Fonction d’une bibliothèque n’utilisant pas CUDA
Inconvénients
Utiliser UVM dans une application
Plus lent qu’une optimisation manuelle des memcpy
Moins de contrôle sur les déplacement de mémoire
Utilisable sur des cartes Nvidia récentes uniquement
Conclusion
Questions ?
top related