2014-06-18 1 views
0

Comme mentionné dans le titre, j'ai trouvé que la fonction de cudaMallocPitch() consomme beaucoup de temps et cudaMemcpy2D() consomme beaucoup de temps aussi bien.Dans CUDA, pourquoi cudaMemcpy2D et cudaMallocPitch consomment beaucoup de temps

Voici le code que je utilise:

cudaMallocPitch((void **)(&SrcDst), &DeviceStride, Size.width * sizeof(float), Size.height); 

cudaMemcpy2D(SrcDst, DeviceStride * sizeof(float), 
     ImgF1, StrideF * sizeof(float), 
     Size.width * sizeof(float), Size.height, 
     cudaMemcpyHostToDevice); 

mise en œuvre, le Size.width et Size.height sont tous les deux 4800. Le temps pour cudaMallocPitch() est d'environ 150-160ms (tests multiples dans des accidents de cas) et cudaMemcpy2D() consume environ 50ms.

Il ne semble pas possible que la bande passante mémoire entre la CPU et le GPU soit si limitée, mais je ne vois pas d'erreurs dans le code, alors quelle est la raison? À propos, le matériel que j'utilise est le processeur Intel I7-4770K et le Nvidia Geforce GTX 780 (assez bon matériel sans erreur).

+0

Avez-vous essayé le bandwidthTest pour votre architecture afin d'obtenir une référence? Un tableau 'float'' 4800x4800' '' 50ms' à transférer signifie une bande passante d'environ '2Go/s'. Je ne suis pas sûr si vous devez également compter le pas attribué dans la taille de la matrice, auquel cas la vitesse augmente. Avec la mémoire épinglée, mon ordinateur portable équipé d'une carte GT540M touche «6 Go/s». – JackOLantern

Répondre

2

De nombreux facteurs peuvent influer sur les performances. En ce qui concerne le cudaMallocPitch, s'il s'agit du premier appel cuda dans votre programme, cela entraînera un surcoût supplémentaire. En ce qui concerne cudaMemcpy2D, ceci est réalisé sous le capot via une séquence d'opérations de memcpy individuelles, une par rangée de votre zone 2D (c'est-à-dire 4800 opérations DMA individuelles). Cela entraînera nécessairement une surcharge supplémentaire par rapport à une opération cudaMemcpy ordinaire (qui transfère la totalité de la zone de données dans un seul transfert DMA). De plus, les vitesses de transfert maximales ne sont atteintes que lorsque le tampon mémoire côté hôte est épinglé. Enfin, vous n'indiquez rien sur votre plate-forme. Si vous êtes sous Windows, alors WDDM interférera avec les performances de transfert complètes pour cette opération, et nous ne savons pas quel type de lien PCIE vous utilisez.

4800 * 4800 * 4/0,050 = 1,84 Go/s, ce qui représente une fraction importante de ~ 3 Go/s disponible pour un transfert non épinglé sur PCIE 2.0. La réduction de 3 Go à 1,84 Go est facilement explicable par les autres facteurs énumérés ci-dessus.

Si vous voulez des performances de transfert complètes, utilisez la mémoire épinglée et n'utilisez pas de transfert en hauteur/2D.

Questions connexes