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?

OriginalL'auteur Derek | 2011-05-19