Cuda hello_world.cu编译但错误地打印“Hello Hello”

时间:2014-07-14 22:41:00

标签: cuda

我找到了以下关于CUDA的hello world程序:

#include <stdio.h>

#define cudaCheckErrors(msg) \
    do { \
        cudaError_t __err = cudaGetLastError(); \
        if (__err != cudaSuccess) { \
            fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
                msg, cudaGetErrorString(__err), \
                __FILE__, __LINE__); \
            fprintf(stderr, "*** FAILED - ABORTING\n"); \
            exit(1); \
        } \
    } while (0)


const int N = 16;
const int blocksize = 16;

__global__
void hello(char *a, int *b)
{
  a[threadIdx.x] += b[threadIdx.x];
}

int main()
{
  char a[N] = "Hello \0\0\0\0\0\0";
  int b[N] = {15, 10, 6, 0, -11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

  char *ad;
  int *bd;
  const int csize = N*sizeof(char);
  const int isize = N*sizeof(int);

  printf("%s", a);

  cudaMalloc( (void**)&ad, csize );
  cudaMalloc( (void**)&bd, isize );
  cudaCheckErrors("cudaMalloc fail");
  cudaMemcpy( ad, a, csize, cudaMemcpyHostToDevice );
  cudaMemcpy( bd, b, isize, cudaMemcpyHostToDevice );
  cudaCheckErrors("cudaMemcpy H2D fail");

  dim3 dimBlock( blocksize, 1 );
  dim3 dimGrid( 1, 1 );
  hello<<<dimGrid, dimBlock>>>(ad, bd);
  cudaCheckErrors("Kernel fail");
  cudaMemcpy( a, ad, csize, cudaMemcpyDeviceToHost );
  cudaCheckErrors("cudaMemcpy D2H/Kernel fail");
  cudaFree( ad );
  cudaFree( bd );

  printf("%s\n", a);
  return EXIT_SUCCESS;
}

我使用nvcc hello_world.cu -o hello成功编译它,但当我运行cuda-memcheck ./hello时,我得到:

========= CUDA-MEMCHECK
Fatal error: cudaMalloc fail (unknown error at hello_world.cu:39)
*** FAILED - ABORTING
Hello ========= ERROR SUMMARY: 0 errors

我是CUDA的新手,我的问题是:
1)引擎盖下发生了什么? 2)我该如何解决?


我正在运行Ubuntu 13.04,x86_64,Cuda 5.5,没有root访问权限。
nvidia-smi的上限输出为:

+------------------------------------------------------+                       
| NVIDIA-SMI 337.19     Driver Version: 337.19         |                       
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX TIT...  Off  | 0000:05:00.0     N/A |                  N/A |
| 26%   37C  N/A     N/A /  N/A |     53MiB /  6143MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+

当我运行deviceQuery时,我得到:

../../bin/x86_64/linux/release/deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

cudaGetDeviceCount returned 30
-> unknown error
Result = FAIL

当我跑deviceQueryDrv时,我得到:

../../bin/x86_64/linux/release/deviceQueryDrv Starting...

CUDA Device Query (Driver API) statically linked version 
cuInit(0) returned 999
-> CUDA_ERROR_UNKNOWN
Result = FAIL

当我跑步时:

#include <cublas_v2.h>
#include <cstdio>
int main()
{
  int res;
  cublasHandle_t handle;
  res = cublasCreate(&handle);
  switch(res) {
  case CUBLAS_STATUS_SUCCESS:
    printf("the initialization succeeded\n");
    break;
  case CUBLAS_STATUS_NOT_INITIALIZED:
    printf("the CUDA Runtime initialization failed\n");
    break;
  case CUBLAS_STATUS_ALLOC_FAILED:
    printf("the resources could not be allocated\n");
    break;
  }
  return 0;
}

我得到the CUDA Runtime initialization failed

1 个答案:

答案 0 :(得分:1)

我刚才遇到的问题和你的一样。运行示例返回“未知错误”并打印“Hello Hello”,并且cublasCreate返回CUBLAS_STATUS_NOT_INITIALIZED。 我在这里找到了答案:http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-linux/index.html#post-installation-actions

  

如果安装了支持CUDA的设备和CUDA驱动程序,但deviceQuery报告不存在支持CUDA的设备,则可能意味着/ dev / nvidia *文件丢失或权限错误。

实际上,我的/dev/nvidia*文件归root所有。 我跑了

chown user.user /dev/nvidia*

(其中user是我的本地用户)并且所有错误都消失了。

编辑:后来我在另一台机器上遇到了类似的问题,这个解决方案没有用,因为/dev/nvidia中的一个设备丢失了。做了什么只是作为sudo执行一次示例代码。之后,/dev/nvidia*中出现了一个额外的设备,示例代码在没有sudo的情况下开始工作。