Cuda hello“U world.cu编译但打印错误”;“你好”;

Cuda hello“U world.cu编译但打印错误”;“你好”;,cuda,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", \

我为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;
}
我是CUDA新手,我的问题是:
1) 引擎盖下面发生了什么事?
2) 我怎样才能修好它


我运行的是Ubuntu 13.04、x86_64、Cuda 5.5,没有root访问权限。
英伟达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 |
+-------------------------------+----------------------+----------------------+
当我运行设备查询时,我得到:

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

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

cudaGetDeviceCount returned 30
-> unknown error
Result = FAIL
../../bin/x86_64/linux/release/deviceQueryDrv Starting...

CUDA Device Query (Driver API) statically linked version 
cuInit(0) returned 999
-> CUDA_ERROR_UNKNOWN
Result = FAIL
当我运行
deviceQueryDrv
时,我得到:

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

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

cudaGetDeviceCount returned 30
-> unknown error
Result = FAIL
../../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;
}
#包括
#包括
int main()
{
国际关系;
立方手柄;
res=cublasCreate(&handle);
开关(res){
案例CUBLAS_状态_成功:
printf(“初始化成功\n”);
打破
案例CUBLAS_状态_未初始化:
printf(“CUDA运行时初始化失败\n”);
打破
案例CUBLAS_状态_分配_失败:
printf(“无法分配资源”);
打破
}
返回0;
}

我得到
CUDA运行时初始化失败

我刚才遇到了一个与您完全相同的问题。运行示例返回“未知错误”并打印“Hello Hello”,而cublasCreate返回CUBLAS_STATUS_NOT_INITIALIZED。 我在这里找到了答案:

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

事实上,我的
/dev/nvidia*
文件是root所有的。 我只是跑了

chown user.user /dev/nvidia*
(其中
user
是我的本地用户)所有错误都消失了


编辑:后来我在另一台机器上遇到了类似的问题,这个解决方案不起作用,因为
/dev/nvidia
中的一个设备丢失了。我们所做的工作就是以
sudo
的形式执行一次示例代码。在那之后,一个额外的设备出现在
/dev/nvidia*
中,示例代码在没有
sudo的情况下开始工作,程序没有任何问题。问题在于您的机器设置,不幸的是,这些简单的示例没有。使用
cuda memcheck
运行您的代码,您会发现您的机器出了问题。运行nvidia smi的结果是什么?你使用的是windows还是linux?安装了什么CUDA版本?使用
CUDA memcheck
运行代码的结果是什么,即
CUDA memcheck./mycode>?安装了什么CUDA版本?安装了什么CUDA版本?在内核调用之后添加。您使用什么命令行编译代码?运行
deviceQuery
示例代码时会发生什么情况?@RobertCrovella您知道一个简单的程序,它带有正确的cuda错误检查,我可以编译并运行吗?如果您可以指向url,最好是添加了错误检查的相同程序。以相同的方式编译/运行。您的linux发行版是32位还是64位?在我的情况下,不需要以root身份拥有所有内容我有:zangetsu@ares~$ls-la/dev/nvidia*crw-rw-1根根目录239,02。6月20日6月20日/dev/nvidia uvm crw rw rw-1根根239,12。6月20日06/dev/nvidia uvm工具crw rw----1根视频195,02。6月19日35/dev/nvidia0 crw rw----1根视频195255 2。6月19日35/dev/nvidiactl