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).
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