CUDA Appareil À transférer cher
J'ai écrit un code pour essayer de permuter les quadrants d'une matrice 2D FFT fins, qui sont stockées dans un tableau plat.
int leftover = W-dcW;
T *temp;
T *topHalf;
cudaMalloc((void **)&temp, dcW * sizeof(T));
//swap every row, left and right
for(int i = 0; i < H; i++)
{
cudaMemcpy(temp, &data[i*W], dcW*sizeof(T),cudaMemcpyDeviceToDevice);
cudaMemcpy(&data[i*W],&data[i*W+dcW], leftover*sizeof(T), cudaMemcpyDeviceToDevice);
cudaMemcpy(&data[i*W+leftover], temp, dcW*sizeof(T), cudaMemcpyDeviceToDevice);
}
cudaMalloc((void **)&topHalf, dcH*W* sizeof(T));
leftover = H-dcH;
cudaMemcpy(topHalf, data, dcH*W*sizeof(T), cudaMemcpyDeviceToDevice);
cudaMemcpy(data, &data[dcH*W], leftover*W*sizeof(T), cudaMemcpyDeviceToDevice);
cudaMemcpy(&data[leftover*W], topHalf, dcH*W*sizeof(T), cudaMemcpyDeviceToDevice);
Notez que ce code prend dispositif de pointeurs, et ne DeviceToDevice transferts.
Pourquoi cela vous semble courir si lent? Cela peut-il être optimisé en quelque sorte? J'ai programmé ce, comparativement à la même opération sur l'hôte en utilisant un memcpy et il était environ 2x plus lent.
Des idées?
Le lancement de cudaMemcpy est coûteuse. Vous êtes mieux de l'écriture d'un noyau qui lit à partir de l'entrée, de swaps et de l'écrit à l'emplacement approprié que de mettre cudaMemcpy dans une boucle for.
hrmmm..la poisse. Que dire de la comparaison de procéder à un hôte memcpy, et de transférer à l'appareil?
hrmmm..la poisse. Que dire de la comparaison de procéder à un hôte memcpy, et de transférer à l'appareil?
OriginalL'auteur Derek | 2011-05-19
Vous devez vous connecter pour publier un commentaire.
J'ai fini par écrire un noyau à faire de swaps. C'était en effet plus rapide que l'Appareil à memcpy opérations
OriginalL'auteur Derek
Peut-être la solution suivante pour effectuer la 2d fftshift dans CUDA serait d'intérêt:
Il consiste à multiplier la matrice à être transformé par un échiquier de
1
s et-1
s qui est l'équivalent de la multiplication parexp(-j*(n+m)*pi)
et donc à des changements dans les deux directions dans le conjugué de domaine.Vous devez appeler ce noyau avant et après l'application de la CUFFT.
Un pro, c'est que la mémoire des mouvements/d'échange sont à éviter.
AMÉLIORATION DE LA VITESSE
À la suite de la suggestion à la NVIDIA Forum, l'amélioration de la vitesse peut être réalisé que par l'évolution de l'instruction
à
d'éviter l'utilisation de la lenteur de la routine pow.
OriginalL'auteur JackOLantern