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

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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