我找到了以下关于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
。
答案 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
的情况下开始工作。