Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';我们无法让简单的CUDA程序工作_Cuda - Fatal编程技术网

Can';我们无法让简单的CUDA程序工作

Can';我们无法让简单的CUDA程序工作,cuda,Cuda,我正在尝试CUDA编程的“hello world”程序:将两个向量相加。以下是我尝试过的程序: #include <cuda.h> #include <stdio.h> #define SIZE 10 __global__ void vecAdd(float* A, float* B, float* C) { int i = threadIdx.x; C[i] = A[i] + B[i]; } int main() { fl

我正在尝试CUDA编程的“hello world”程序:将两个向量相加。以下是我尝试过的程序:

#include <cuda.h>
#include <stdio.h> 
#define  SIZE 10

__global__  void vecAdd(float* A, float* B, float* C) 
{ 
   int i = threadIdx.x; 
   C[i] = A[i] + B[i]; 
} 

int  main() 
{ 
     float A[SIZE], B[SIZE], C[SIZE]; 
     float *devPtrA, *devPtrB, *devPtrC; 
     size_t memsize= SIZE * sizeof(float); 

     for (int i=0; i< SIZE; i++) {
        A[i] = i;
        B[i] = i;
     }

     cudaMalloc(&devPtrA, memsize); 
     cudaMalloc(&devPtrB, memsize); 
     cudaMalloc(&devPtrC, memsize); 
     cudaMemcpy(devPtrA, A, memsize,  cudaMemcpyHostToDevice); 
     cudaMemcpy(devPtrB, B, memsize,  cudaMemcpyHostToDevice); 

     vecAdd<<<1, SIZE>>>(devPtrA,  devPtrB, devPtrC); 
     cudaMemcpy(C, devPtrC, memsize,  cudaMemcpyDeviceToHost); 

     for (int i=0; i<SIZE; i++) 
         printf("C[%d]: %f + %f => %f\n",i,A[i],B[i],C[i]); 

     cudaFree(devPtrA); 
     cudaFree(devPtrB); 
     cudaFree(devPtrC); 
}
输出如下:

C[0]: 0.000000 + 0.000000 => 0.000000
C[1]: 1.000000 + 1.000000 => 0.000000
C[2]: 2.000000 + 2.000000 => 0.000000
C[3]: 3.000000 + 3.000000 => 0.000000
C[4]: 4.000000 + 4.000000 => 0.000000
C[5]: 5.000000 + 5.000000 => 0.000000
C[6]: 6.000000 + 6.000000 => 0.000000
C[7]: 7.000000 + 7.000000 => 0.000000
C[8]: 8.000000 + 8.000000 => 366987238703104.000000
C[9]: 9.000000 + 9.000000 => 0.000000
每次运行它,我都会得到C[8]的不同答案,但所有其他元素的结果总是0.000000

Ubuntu 11.04系统是一个64位Xeon服务器,有4个内核,运行最新的NVIDIA驱动程序(于2012年10月4日下载)。该卡是一款EVGA GeForce GT 430,具有96个内核和1GB的RAM


<>我应该怎么弄清楚发生了什么?

最有可能的原因:英伟达司机没有被装载。在无头Linux系统上,X Windows没有运行,因此在引导时没有加载驱动程序

以root用户身份运行
nvidia smi-a
,加载它们并以报告的形式获得确认


虽然现在已加载驱动程序,但每次运行CUDA程序时仍需要初始化驱动程序。使用
nvidia smi-pm 1将驱动程序置于持久模式,使其始终保持初始化状态。将此添加到启动脚本(例如rc.local)中,这样每次启动时都会发生此情况。

您的驱动程序似乎没有初始化,但不检查cuda返回代码始终是一种不好的做法,您应该避免这种情况。以下是可用于cuda调用的简单函数+宏(引用cuda的示例):

现在开始调用您的函数,如:

HANDLE_ERROR(cudaMemcpy(...));

您是否从安装cuda sdk?(不是工具包)我猜CUDA无法初始化。我建议在每个CUDA API调用中添加错误检查。@gokcehan我从该网站下载了驱动程序、工具箱和SDK。不过,我不确定如何使用SDK。它似乎主要包含文档和示例代码。正如我所记得的,toolkit包含编译器(nvcc),而SDK包含库。我记得有一个类似的问题,因为我没有安装其中一个。奇怪的是,当您尝试在不安装SDK的情况下运行时,它不会给您一个错误。编译和运行CUDA代码不需要SDK。如果您使用SDK中的某些东西,例如某些SDK中的cutil,那么您当然需要它。但是您的代码似乎对SDK没有任何依赖性。您的工具包安装可能还可以,因为您可以使用nvcc进行编译。剩下的是GPU和驱动程序。@njuffa的评论绝对是推荐的,并且始终是良好的实践。您还可以从linux命令行运行nvidia smi-a,以查看GPU是否正确可用。值得指出的是,linux发行说明和/或linux入门PDF中已经明确介绍了此问题的解决方案。很高兴知道这一点。如果只有英伟达的安装者指点我。相反,它说“查看供应商发行版的文档”,Ubuntu的文档假设每个人都在运行GUI。
static void HandleError( cudaError_t err,
                         const char *file,
                         int line ) {
    if (err != cudaSuccess) {
        printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
                file, line );
        exit( EXIT_FAILURE );
    }
}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
HANDLE_ERROR(cudaMemcpy(...));