CUDA: cudaMemcpy работает только в режиме эмуляции - PullRequest
3 голосов
/ 19 марта 2010

Я только начинаю учиться пользоваться CUDA. Я пытаюсь запустить простой пример кода:


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

Когда я запускаю в режиме эмуляции (nvcc -deviceemu), он работает нормально (и копирует массив) Но когда я запускаю его в обычном режиме, он запускается без ошибок, но никогда не копирует данные. Как будто строки cudaMemcpy просто игнорируются.

Что я делаю не так?

Большое спасибо, Джейсон

Ответы [ 2 ]

3 голосов
/ 20 марта 2010

Вы должны проверять наличие ошибок, в идеале для каждого malloc и memcpy, но достаточно сделать это один раз в конце (cudaGetErrorString(cudaGetLastError()).

Просто чтобы проверить очевидное:

  • У вас есть графический процессор с поддержкой CUDA, верно? Запустите образец deviceQuery SDK, чтобы убедиться, что устройство работает правильно, а все драйверы установлены и работают.
  • N (в memcpy) равно 4 (в malloc), верно?
1 голос
/ 28 октября 2010

Проверьте, есть ли у вас устройство с поддержкой CUDA. Возможно, вы можете попробовать запустить приведенный ниже код и посмотреть, какую информацию вы получите:

#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" );
    }
}
...