2010-03-19 20 views
3

Je commence tout juste à apprendre à utiliser CUDA. Je suis en train d'exécuter un code d'exemple simple:CUDA: cudaMemcpy ne fonctionne qu'en mode d'émulation


float *ah, *bh, *ad, *bd; 
ah = (float *)malloc(sizeof(float)*4); 
bh = (float *)malloc(sizeof(float)*4); 
cudaMalloc((void **) &ad, sizeof(float)*4); 
cudaMalloc((void **) &bd, sizeof(float)*4); 
... initialize ah ... 

/* copy array on device */ 
cudaMemcpy(ad,ah,sizeof(float)*N,cudaMemcpyHostToDevice); 
cudaMemcpy(bd,ad,sizeof(float)*N,cudaMemcpyDeviceToDevice); 
cudaMemcpy(bh,bd,sizeof(float)*N,cudaMemcpyDeviceToHost); 

Quand je lance en mode d'émulation (nvcc -deviceemu), il fonctionne très bien (et en fait une copie du tableau). Mais quand je l'exécute en mode normal, il fonctionne sans erreur, mais ne copie jamais les données. C'est comme si les lignes cudaMemcpy étaient simplement ignorées.

Qu'est-ce que je fais mal?

Merci beaucoup, Jason

+0

Oups. Cela semble être un problème avec cudaMalloc(). Il n'alloue pas la mémoire sur l'appareil. Pourquoi donc? – Jason

+0

avez-vous initialisé l'appareil? utiliser cuda obtenir la dernière erreur pour imprimer le statut – Anycorn

+1

@aaa: Utiliser l'API d'exécution (fonctions préfixées avec cuda au lieu de cu) signifie que vous n'avez pas besoin d'initialiser explicitement un périphérique, il se connectera au premier périphérique compatible sur le premier appel cuda . – Tom

Répondre

3

Vous devriez vérifier les erreurs, idéalement sur chaque malloc et memcpy mais juste le faire une fois à la fin sera suffisant (cudaGetErrorString(cudaGetLastError()).

Juste pour vérifier l'évidence :

  • Vous avez un CUDA GPU capable, juste exécuter l'exemple SDK deviceQuery pour vérifier l'appareil fonctionne correctement et tous les pilotes sont installés et fonctionnent
  • ?.
  • N (dans le memcpy) est égal à 4 (dans le malloc), non?
1

Voyez si vous avez un périphérique compatible CUDA. Probablement, vous pouvez essayer d'exécuter le code ci-dessous et voir quelles informations vous obtenez:

#include <cstdio> 

int main(void) { 
    cudaDeviceProp prop; 

    int count; 
    cudaGetDeviceCount(&count); 
    for (int i=0; i< count; i++) { 
     cudaGetDeviceProperties(&prop, i); 
     printf(" --- General Information for device %d ---\n", i); 
     printf("Name: %s\n", prop.name); 
     printf("Compute capability: %d.%d\n", prop.major, prop.minor); 
     printf("Clock rate: %d\n", prop.clockRate); 
     printf("Device copy overlap: "); 
     if (prop.deviceOverlap) 
      printf("Enabled\n"); 
     else 
      printf("Disabled\n"); 
     printf("Kernel execution timeout : "); 
     if (prop.kernelExecTimeoutEnabled) 
      printf("Enabled\n"); 
     else 
      printf("Disabled\n"); 

     printf(" --- Memory Information for device %d ---\n", i); 
     printf("Total global mem: %ld\n", prop.totalGlobalMem); 
     printf("Total constant Mem: %ld\n", prop.totalConstMem); 
     printf("Max mem pitch: %ld\n", prop.memPitch); 
     printf("Texture Alignment: %ld\n", prop.textureAlignment); 

     printf(" --- MP Information for device %d ---\n", i); 
     printf("Multiprocessor count: %d\n", 
        prop.multiProcessorCount); 
     printf("Shared mem per mp: %ld\n", prop.sharedMemPerBlock); 
     printf("Registers per mp: %d\n", prop.regsPerBlock); 
     printf("Threads in warp: %d\n", prop.warpSize); 
     printf("Max threads per block: %d\n", 
        prop.maxThreadsPerBlock); 
     printf("Max thread dimensions: (%d, %d, %d)\n", 
        prop.maxThreadsDim[0], prop.maxThreadsDim[1], 
        prop.maxThreadsDim[2]); 
     printf("Max grid dimensions: (%d, %d, %d)\n", 
        prop.maxGridSize[0], prop.maxGridSize[1], 
        prop.maxGridSize[2]); 
     printf("\n"); 
    } 
}